|
并发操作是指在多用户共享的系统中,许多用户可能同时对同一数据进行操作。并发操作带来问题的原因是事务的并发操作破坏了事务的隔离性。DBMS的并发控制子系统负责协调并发事务的执行,保证数据库的完整性不被破坏,避免用户得到不正确的数据。
|
|
|
|
并发操作带来的数据不一致性有3类,即丢失修改、不可重复读和读"脏"数据。
|
|
|
|
|
|
(1)排他锁(X锁)。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他事务都不能再对A加任何类型的锁,直到T释放A上的锁。
|
|
|
(2)共享锁(S锁)。若事务T对数据对象A加上S锁,则只允许T读取A,但不能修改A,其他事务只能再对A加S锁,直到T释放A上的S锁。
|
|
|
|
(1)一级封锁协议。事务在修改数据R之前必须先对其加X锁,直到事务结束才释放。一级封锁协议可以解决丢失更新问题。
|
|
|
(2)二级封锁协议。在一级封锁协议的基础上,加上事务T在读取数据R前必须先对其加S锁,读完后即可释放S锁。二级封锁协议可以解决读"脏"数据的问题,但是由于二级封锁协议读完数据后即可释放S锁,所以它不能保证可重复读。
|
|
|
(3)三级封锁协议。在一级封锁协议的基础上,加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议可以防止丢失修改、读"脏"数据和不可重复读。
|
|
|
|
活锁是指当事务T1封锁了数据R,事务T2请求封锁数据R,于是T2等待。T3也请求封锁R,当T1释放R上的封锁后,系统首先批准T3的请求,于是T2仍等待。然后T4又请求封锁R,当T3释放R上的封锁之后系统首先批准T4的请求……T2可能永远等待。
|
|
|
死锁是指两个以上的事务分别请求封锁对方已经封锁的数据,导致长期等待而无法继续运行下去的现象。
|
|
|
|
【定义9-11】多个事务的并行执行是正确的,当且仅当其结果与某一次序串行地执行它们时的结果相同时,这种调度策略称为可串行化的调度。
|
|
|
可串行性是并行事务正确性的准则,按照这个准则规定,一个给定的并发调度,当且仅当它是可串行化的才认为是正确调度。
|
|
|
|
两段封锁协议是指所有事务必须分两个阶段对数据加锁和解锁:第一阶段是获得封锁;第二阶段是释放封锁。
|
|
|
|
封锁对象的大小称为封锁的粒度。封锁的对象可以是逻辑单元也可以是物理单元。
|
|
|