并发操作带来的问题

并发操作带来的数据不致性有三类:丢失更新、不可重复读、读脏数据;

并发操作带来的问题

分析:

对于T1、T2

  T2在t9时保存了D2=D3-D2=200,T1在t10、t11、t12处再次读,其中t11读D2时,读的是T2在t9时保存的D2=D3-D2=200,T1在t4时x1=D1+D2+D3=350,但因为T2在t9时写D2=300,所以在T1在t13处的结果是x1=50+200+300=550;读的数据前后不一致----不可重复读

对于T2,T3

     T3在t7读的D2,与t2在t5读的D2,其值 都是D2=100;T2在t9处写入D2=D3-D2=200;=但是因为T3读时在t7,即在T2的写之前就读完毕,因此T2在t9的写,对T3在t7的读没有影响。因此T3在t15 写D2 =100+50=150.T2在t9写的D2=D3-D2=200被T3在t15处D2=D2+50=100+50=150覆盖;t2丢失了修改,-------丢失修改。

但是如果把T3在t7处的读,移到t9之后,如图

并发操作带来的问题

因为T3在T2于t9写D2之后,在t10处读,T3读的D2,是T2在t9时写D2=D3-D2=300-200,所以T3在t10读的D2=300-100=200;

T3在t15处写的D2=200+50=250,这就是 我们单用户模式下,程序按先后执行的那种。

继续深入

如果T2因为某种原因突然反悔了,T2执行了ROLLBACK,撤消操作,结果会什么样?

如下图

并发操作带来的问题

T2在t16处提交了取消更新,D1,D2,D3恢复原值。但是T3只在T10处读,恢复前d2=D3-D2+50=300-100+50=250

但是 T2撤消写D2了(D2还是等于100),T3仍然记住t10读的D2值。所以错了。------读脏数据