所谓并发操作,是指在多用户共享的系统中,许多用户可能同时对同一数据进行操作。所带来的问题是数据的不一致性,具体表现为:丢失更新、不可重复读、读脏数据。
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两个读的情况)
用有向图判断是否可串行化
如图
上图有两个事务并发,则在纸上分别画两个圆图,并在圆中注明事务号,如下图
对于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的箭头,没有必要再进行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),参数一致,得画线了。
形成闭环。表明调度错误。
再看下图
用有向图分析调度是否正确
有上 图,仍然有两个事务,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),所以不能画线。
结论:上图中的调度是正确,
又如下图,用有向图判断
有上 图,仍然有两个事务,T0,T1,则分别画两个图,并注明
对于T0
A步 在T0列找Write(X),我们发现在t3列中发现Write(A),而T1在t3之后的t4处有Read(A),得画线了如图
对于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)与之对应对,所以也不能画线。
没有行成循环,所以上面的调度是正确的,
,
事务高深,我只是学了皮毛而已,仅当做笔记吧。
别喷我!