文档介绍:数据库原理
第十一章 并发控制
主讲:谢益武
大连海事大学计算机科学与技术学院
研究方向:软件工程与理论•数据库与信息系统
电话:84729625
Email:******@
问题的产生
多用户数据库
读“脏”数据
T1将C值修改为200,T2读到C为200
T1由于某种原因撤销,其修改作废,C恢复原值100
这时T2读到的C为200,与数据库内容不一致,就是“脏”数据
并发控制概述(续)
数据不一致性:由于并发操作破坏了事务的隔离性
并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性
并发控制概述(续)
并发控制的主要技术
封锁(Locking)
时间戳(Timestamp)
乐观控制法
商用的DBMS一般都采用封锁方法
第十一章 并发控制
并发控制概述
封锁
封锁协议
活锁和死锁
并发调度的可串行性
两段锁协议
小结
封锁
什么是封锁
基本封锁类型
锁的相容矩阵
什么是封锁
封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁
加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。
基本封锁类型
一个事务对某个数据对象加锁后究竟拥有什么样的控制由封锁的类型决定。
基本封锁类型
排它锁(Exclusive Locks,简记为X锁)
共享锁(Share Locks,简记为S锁)
排它锁
排它锁又称为写锁
若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁
保证其他事务在T释放A上的锁之前不能再读取和修改A
共享锁
共享锁又称为读锁
若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁
保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改
锁的相容矩阵
Y=Yes,相容的请求
N=No,不相容的请求
T1 T2
X
S
-
X
N
N
Y
S
N
Y
Y
-
Y
Y
Y
锁的相容矩阵(续)
在锁的相容矩阵中:
最左边一列表示事务T1已经获得的数据对象上的锁的类型,其中横线表示没有加锁。
最上面一行表示另一事务T2对同一数据对象发出的封锁请求。
T2的封锁请求能否被满足用矩阵中的Y和N表示
Y表示事务T2的封锁要求与T1已持有的锁相容,封锁请求可以满足
N表示T2的封锁请求与T1已持有的锁冲突,T2的请求被拒绝
使用封锁机制解决丢失修改问题
T1
T2
① Xlock A
② R(A)=16
Xlock A
③ A←A-1
等待
W(A)=15
等待
Commit
等待
Unlock A
等待
④
获得Xlock A
R(A)=15
A←A-1
⑤
W(A)=14
Commit
Unlock A
例:
事务T1在读A进行修改之前先对A加X锁
当T2再请求对A加X锁时被拒绝
T2只能等待T1释放A上的锁后T2获得对A的X锁
这时T2读到的A已经是T1更新过的值15
T2按此新的A值进行运算,并将结果值A=14送回到磁盘。避免了丢失T1的更新。
没有丢失修改
使用封锁机制解决不可重复读问题
T1
T2
① Slock A
Slock B
R(A)=50
R(B)=100
求和=150
②
Xlock B
等待
等待
③ R(A)=50
等待
R(B)=100
等待
求和=150
等待
Commit
等待
Unlock A
等待
Unlock B
等待
④
获得XlockB
R(B)=100
B←B*2
⑤
W(B)=200
Commit
Unlock B
事务T1在读A,B之前,先对A,B加S锁
其他事务只能再对A,B加S锁,而不能加X锁,即其他事务只能读A,B,而不能修改
当T2为修改B而申请对B的X锁时被拒绝只能等待T1释放B上的锁
T1为验算再读A,B,这时读出的B仍是100,求和结果仍为150,即可重复读
T1结束才释放A,B上的S锁。T2才获得对B的X锁
可重复读
使用封锁机制解决读“脏”数据问题
T1
T2
① Xlock C
R(C)=100
C←C*2
W(C)=200