怎么证明遵循两段锁协议的事务调度处理的结果是可串行化的?

来源:百度知道 编辑:UC知道 时间:2024/06/03 20:53:51
如题
简单来说就是两段锁协议为什么能保证并发执行的结果是正确的

*********************************
证明如下,(书上摘的)。
*********************************

证明:首先以两个并发事务 Tl 和T2为例,存在多个并发事务的情形可以类推。根据可串行化定义可知,事务不可串行化只可能发生在下列两种情况:

( l )事务 Tl 写某个数据对象 A ,T2读或写 A ;

( 2 )事务 Tl 读或写某个数据对象 A ,T2写 A 。

下面称 A 为潜在冲突对象。

设 Tl 和T2访问的潜在冲突的公共对象为{A1,A2 … , An }。不失一般性,假设这组潜在冲突对象中 X =(A 1 , A2 , … , Ai }均符合情况 1 。 Y ={A i + 1 , … , An }符合所情况( 2 )。

VX ∈ x , Tl 需要 XlockX ①

T2 需要 Slockx 或 Xlockx ②

1 )如果操作 ① 先执行,则 Tl 获得锁,T2等待

由于遵守两段锁协议, Tl 在成功获得 x 和 Y 中全部对象及非潜在冲突对象的锁后,才会释放锁。

这时如果存在 w ∈ x 或 Y ,T2已获得 w 的锁,则出现死锁;否则, Tl 在对 x 、 Y 中对象全部处理完毕后,T2才能执行。这相当于按 Tl 、T2的顺序串行执行,根据可串行化定义, Tl 和几的调度是可串行化的。

2 )操作 ② 先执行的情况与( l )对称因此,若并发事务遵守两段锁协议,在不发生死锁的情况下,对这些事务的并发调度一定是可串行化的。证毕。

*********************************
以上,希望对你有所帮助。
*********************************

王能斌的《数据库系统教程》上面有证明的全过程,在7.8.2节

其实这个很好直观感受的,既然所有的加锁动作都在解锁之前,想要使用的资源必须要先占有他,自然不