一 并发控制概述:
(1)事务是并发控制的基本单元。
(2)数据库中多个事务并发执行时,事务的隔离性和一致性可能会遭到破坏,DBMS需要对并发事务相互作用加以控制,即并发控制机制。
(3)并发操作带来的数据不一致性包括(T1和T2为事务):
*丢失修改:T1和T2同时修改数据,T2提交的结果修改了T1提交的结果,导致T1的修改丢失。
*不可重复读:T1读取数据后,T2执行修改操作,使T1无法再现前一次读取的结果。
*读"脏"数据:T1修改某一数据,并写回磁盘,T2读取同一数据后,T1由于某种原因撤销,这时T1已修改的数据恢复原值,T2读取的数据就与数据库中的数据不一致。
(4)并发控制技术:
*封锁(locking):商用数据库一般采用封锁方法。
*时间戳(Timestamp)
*等等。
二 封锁:实现并发控制的一个重要技术,但封锁会造成死锁和饥饿等现象。
(1)基本的封锁类型:
*排它锁(写锁)
*共享锁(读锁)
(2)封锁粒度:
*封锁粒度:封锁对象的大小。
*封锁粒度越大,并发度越小,系统开销也小;封锁粒度越小,并发度越高,系统开销越大。
三并发调度的可串行性:
(1)定义:多个事务并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,称这种调度为“可串行化调度”。
(2)可串行化是并发事务正确调度的准则。按照这个准则一个给定的并发调度,当且仅当它是可串行化的,才认为是正确的调度。
(3)目前RDMS普遍采用两段锁协议(Two-Phase Locking)来实现并发调度的可串行性。若并发执行的所有事务都遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的。事务遵守两段锁协议时可串行化的充分条件。
(4)两段锁协议:指所有事务必须分两个阶段对数据项加锁和解锁。
*在对任何数据进行读、写操作之前,首先要申请并获得对数据的封锁。
*在释放一个封锁之后,事务不再申请和获得任何其他封锁。
(5)一次封锁法遵守两段锁协议,但是两段锁协议不要求必须一次将所有要使用的数据加锁,因此遵守两端锁协议的事务可能发生死锁。
四 死锁、活锁和饥饿:
(一)基本概念:
*死锁:是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
*活锁(英文 livelock):指事务1可以使用资源,但它让其他事务先使用资源;事务2可以使用资源,但它也让其他事务先使用资源,于是两者一直谦让,都无法使用资源(数据库中的概念)。
*饥饿:是指如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求......T2可能永远等待,这就是饥饿。
*解决活锁和饥饿的简单方法:先来先服务策略。
(二)死锁的处理方法:
(1)预防死锁(操作系统中广泛采用的预防策略的并不很适合数据库,RDBMS中解决死锁问题的采取检测和解除死锁的方法):
1.一次封锁法:要求每个事务都必须一次将所有要使用的数据全部加锁,否则就不能继续执行。
2.顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
(2)死锁的诊断与解除:
1.超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。
2.等待图法。