数据库系统实现实验报告
Two Phase Locking
东华大学
数据库系统实现实验报告
题目:Two Phase Locking
学号: 姓名: 学院: 专业:
2131524 王国林
计算机科学与技术学院 计算机应用技术
指导老师: 王洪亚
I
数据库系统实现实验报告
Two Phase Locking
目录
1、实验目的 ..................................................................................................................................... 1 2、实验内容 ..................................................................................................................................... 1 3、程序运行的主要环境 ................................................................................................................. 1 4、设计思路 ..................................................................................................................................... 2
4.1总体设计 ............................................................................................................................. 2 4.2详细设计 ............................................................................................................................. 2 5、心得体会 ..................................................................................................................................... 6
II
数据库系统实现实验报告
Two Phase Locking
1、实验目的
通过基于锁的并发控制系统的模拟实现,掌握两段加锁协议和简单并发控制系统的构建;理解事务并发访问造成的不可串行化和如何保证可串行化的技术。
2、实验内容
构建一个基于锁的并发控制系统,具体包括:
随机生成若干(N个)并发执行的事务,每个事务为如下的操作序列T={begin-transaction}r(x1)w(x1,Val1)r(x2)w(x2,Val2)…{commit}。其中Val1,Val2等为随机生成的整数;事务读写操作的对象x1, x2…来自于数据库DB={x1, x2, x3, …},数据库大小自定义。每个事务具体操作那些数据对象也随机生成,请注意不是每个事务都访问数据库内的每个数据项。
构建模拟程序实现锁表和事务调度模块。
顺序执行随机生成的N个事务,记录下所有排列下的最终数据库状态。 不使用并发控制机制,并发执行所有N事务,将最终数据库状态和顺序执行的数据库状态做对比。其中并发执行的模拟可让每个事务执行完一个(或几个)操作后,随机挑选其他的事务执行,以此类推,直至所有事务全部提交。注意记录事务执行过程的并发性,即每个时刻有几个事务在同时执行。
使用两段加锁机制进行并发控制,查看事务执行后数据库的状态和某种顺序执行状态是否一致。
3、程序运行的主要环境
操作系统:win7 32位
CPU:Intel Pentium(R) Dual-Core T4400 @2.2GHz 内存:2GB DDR2 1.19GHz
1
数据库系统实现实验报告
Two Phase Locking
4、设计思路
4.1总体设计
在初始化各种数据类型后,用WithoutTwoPhaseLocking()模拟运行没有两阶段锁的情况下多事务运行,用TwoPhaseLocking()来模拟两阶段锁前提下多事务的运行。事务的个数在2-7个当中用随机函数随机产生,事务的开始优先也有随机函数决定,对于数据库中访问记录的位置也有随机函数产生,这样就可以模拟线程发生的随机性。
4.2详细设计
5.2.1初始化
? 初始化数据库,这里定义一个有十条记录的数据库: public static int test[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; ? 定义七个线程:
publicstaticThreadnum[] transactions = newThreadnum[7]; ? 每个事务的标志位以及访问标志位初始化为false:
public static void begin() {
}
for (int i = 0; i < 5; i++)
tag[i] = false;
for (int j = 0; j < 5; j++)
for (int m = 0; k < 10; k++)
value[j][k] = false;
4.2.2 不使用两阶段锁的事务执行情况
首先使用随机函数产生数量大于等于二的事务,在没有两阶段锁的情况下,这些事务的执行顺序是随机的,其读写操作的正确性都没有保证。同时他们的执行顺序可能是串行也可能不是。
WithoutTwoPhaseLocking()函数用来模拟不使用两阶段锁的情况下多事务并发执
2
数据库系统实现实验报告
Two Phase Locking
行的状况。
? 保证事务数目大于等于二:
inttasknum = (int) (Math.random() * 5); while (tasknum< 2)
tasknum = (int) (Math.random() * 5);
? 随机生成3个及其以上的active事务,由于线程之间的无序性,所以执行结果如下
所示:
可以看出T1开始的时间比T3早,但是结束的却比T3晚,任务执行顺序得不到保障,事务读写的正确性也得不到保障。
4.2.3 加锁的事务随机执行及其结果。 两阶段锁的兼容矩阵:
S X
在顺序执行的各个事务中,需要对各个操作加上相应的锁即s和x锁,为了
3
S T F X F F