数据库并发控制 事务调度 可串行调度

所谓并发操作,是指在多用户共享的系统中,许多用户可能同时对同一数据进行操作。所带来的问题是数据的不一致性,具体表现为:丢失更新、不可重复读、读脏数据。

1、事务调度

     1.1 串行调度:(Serial Schedule)是指多个事务依序串行执行,且 只有当一个事务的所有操作执行完后,才执行另一个事务的所用操作。

   1.2 并发调度:(Concurrent Schedule)利用分时的方法同时处理多个事务;

  1.2.1 并发调度的可串行性

   1.2.1.1可串行化的调度

            多个事务并发执行是正确的,当且仅当其结果与某一次序串行的执行它们时的结果相同,称这种调度策略是可串行化的调度

   (Serializability Schedule).可串行性是并发事务正确性的准则,按这个准则规定,一个给定的并发调度,当且仅当它是可串行化的才认为是正确调度

  1.2.1.2冲突可串行化判定(write =w, R=read)

    测试调度S的可串行化:
   对于调度S的事务T1,在图中创建一个节点 T1
   A步、对于每种这样的情形:如果S中的在T1执行了W(X)操作后,执行T2的R(X),那么优先图中创建一条边(T1 --》T2 )
   B步、对于每种这样的情形:如果S中的在T1执行了R(X)操作后,执行T2的W(X),那么优先图中创建一条边(T1 --》T2 ) 
   C步、对于每种这样的情形:如果S中的在T1执行了W(X)操作后,执行T2的W(X),那么优先图中创建一条边(T1 --》T2 )
   当且仅当优先图中没有闭环时,调度S是可串行化的。(不用考虑 T1 、T2两个读的情况) 

用有向图判断是否可串行化

如图

数据库并发控制 事务调度 可串行调度_第1张图片

上图有两个事务并发,则在纸上分别画两个圆图,并在圆中注明事务号,如下图

对于T0

A步,在T0列中找W(X),我们发现T0只有在T8处有Write(A),又在T8之后,T1列有Write(B),但是因为参数不同,一个是A,一个是B,所以不符A步的规则。不能画箭头。

B步,在T0列中找R(X),我们发现T0在T1有Read(A),之后,到T1列中找W(X),我们发现在T1列T6处Write(A),符合

因此得画一条箭头从T0指向T1,如图  

 因为已经画了一条从T0到T1的箭头,没有必要再进行C步。

对T1

A步 在T1列中找W(X),我们发现在T1在T6时间有Write(A),在T6之后找不到对应的Read(A),所以不能画线;

B步在T1列中找R(X),我们发现在T1,在T3处有Read(A),在T3之后,T0在T8处有Write(A),参数一致,得画线了。

结果如图数据库并发控制 事务调度 可串行调度_第2张图片

形成闭环。表明调度错误。


再看下图

数据库并发控制 事务调度 可串行调度_第3张图片

用有向图分析调度是否正确

有上 图,仍然有两个事务,T0,T1,则分别画两个图,并注明

 

对T0

 A步:T0在t3处有Write(A),于是我们到T1列中查找对应的R(A),我们 发现T1列在t4处有Read(A)(并且T4,在T3 之后),得画线了,如图因为A已经画了一条线,B步,C步没必要再找了

 

对于T1 

A步  在T7,在t7处发现Write(A ,在t0列,t7之后没有Read(A)对应,所以不能画线

B步  在T1列中找Read(X),在t4处发现Read(A),在t4之后,T0列并没有 Write(A)跟着对应,所以不能画线

C步 在T1列中找到Write(X),在t7处发现Write(A),在t7之后,在t0列没有Write(A),跟着对应,所以不能画线,

       在T1列中t13处找到write(B),在t13之后,T0列已经执行完毕,也就是找不到对应的write(B),所以不能画线。

结论:上图中的调度是正确,


又如下图,用有向图判断

数据库并发控制 事务调度 可串行调度_第4张图片

 

有上 图,仍然有两个事务,T0,T1,则分别画两个图,并注明

对于T0

A步 在T0列找Write(X),我们发现在t3列中发现Write(A),而T1在t3之后的t4处有Read(A),得画线了如图

 

如图因为A步已经画了一条线,B步,C步没必要再找了




对于T1 

A步   在t9处发现Write(A),在t9之后,t0列并没有发read(A),所以不能画线,在T1列,t13处发现Write(B)但在t0,t13处之后并没有到对应的read(B)

B 步  在T1列中t4处找到 Read(A),但在t4之后T0列并没有对应的Write(A),不能画线,在t11处发现Read(B),在t11之后并没有发现Write(B)对应,也不能画线。

C步 在T1列中找write(X),在T9处找到write(A),在t9之后并没找到write(A)跟之对应,所以不能画线;

     在T1列t13处发现Write(B),在t13之后,没有发现 write(B)与之对应对,所以也不能画线。

最终结果

没有行成循环,所以上面的调度是正确的,

,

事务高深,我只是学了皮毛而已,仅当做笔记吧。

别喷我!

 

你可能感兴趣的:(数据库,数据库,事务,调度)