数据库笔记(第十一章)

  •  并发控制

一:并发控制概述

1.并发控制机制的任务:对并发操作进行正确调度;保证事务的隔离性;保证数据库的一致性。

2.并发操作带来的数据不一致性:丢失修改(Lost Update);不可重复读(Non-repeatable Read);读“脏”数据(Dirty Read)

3.不可重复读包括三种情况:(1)事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时,得到与前一次不同的值 ;(2)事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘地消失了; (3)事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。

   后两种不可重复读有时也称为幻影现象(Phantom Row)

  1. 读“脏”数据是:事务T1修改某一数据,并将其写回磁盘;事务T2读取同一数据后,T1由于某种原因被撤销;这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致;T2读到的数据就为“脏”数据,即不正确的数据 。
  2. 并发控制的主要技术:封锁(Locking);时间戳(Timestamp);乐观控制法;多版本并发控制(MVCC)

二:封锁

1.什么是封锁:封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁;加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象;封锁是实现并发控制的一个非常重要的技术。

2.基本封锁类型:

排它锁(Exclusive Locks,简记为X锁):排它锁又称为写锁

若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁;保证其他事务在T释放A上的锁之前不能再读取和修改A。

共享锁(Share Locks,简记为S锁)共享锁又称为读锁:若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁;保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改 。

三:封锁协议

什么是封锁协议?在运用X锁和S锁对数据对象加锁时,需要约定一些规则,这些规则为封锁协议(Locking Protocol)。

何时申请X锁或S锁;持锁时间;何时释放

对封锁方式规定不同的规则,就形成了各种不同的封锁协议,它们分别在不同的程度上为并发操作的正确调度提供一定的保证。

一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。

正常结束(COMMIT):非正常结束(ROLLBACK)

一级封锁协议可防止丢失修改,并保证事务T是可恢复的。在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。

二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。二级封锁协议可以防止丢失修改和读“脏”数据。在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。

三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议可防止丢失修改、读脏数据和不可重复读。

四:活锁和死锁

  1. 活锁:事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求……T2有可能永远等待,这就是活锁的情形 。
  2. 死锁

事务T1封锁了数据R1;T2封锁了数据R2;T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁;接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁;这样T1在等待T2,而T2又在等待T1,T1和T2两个事务永远不能结束,形成死锁 。

五:两段锁协议

数据库管理系统对并发事务不同的调度可能会产生不同的结果,串行调度是正确的

执行结果等价于串行调度的调度也是正确的,称为可串行化调度

可串行化(Serializable)调度

多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同

可串行性(Serializability)

是并发事务正确调度的准则

一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度

猜你喜欢

转载自blog.csdn.net/sdau20171761/article/details/84934470