事务并发调度之封锁技术
上一篇 /
下一篇 2012-10-10 13:50:33
/ 个人分类:数据库
4]Ve;h4R
T)lI0 什么是事务51Testing软件测试网#_ Uclyr
51Testing软件测试网UBZ;J}*NhH 事务是数据库逻辑工作单
位,是用户定义的一组操作序列。具有原子性、一致性、隔离性和持续性。原子性表示操作不可分割,要么都做,要么都不做。一致性表示数据库从一个一致性状态
变换到另一个一致性状态隔离性表示事务执行过程中不被其它事务打扰持续性表示事务一旦提交,它对数据库中数据的改变就应该是永久性的。51Testing软件测试网"\D7NjD5Af kN2iS
H)h
gKw5X%Eg0 事务并发的问题
4|h7W.p%e7O5F0t(S#l{'g0 (1)丢失修改,当事务1在t1时刻读取A=16,事务2在t2时刻读取A=16,在t3时刻事务1修改A=A-1;写回数据库A=15。在t4时刻事务2更新A=A-1,写回数据库A=15。这样导致了事务1的修改丢失。如下图:
6V X?0X(O&QPS0
`e/t2[GP(K5O0 (2)不可重复读,当事务1在t1时刻读取A=50,读取B=100,求和=150,事务2在t2时刻更新B=100,修改B=B*2,写回B=200,在t3时刻事务1读取值校对重读B,发现B变为200与第一次读取不一致,如下图:
~[5l_A(@@yxo,}*R0
M |9XW)l
\q9@n0 (3)脏读,事务1在t1时刻读取C=100,更新C=C*2写回数据库C=200,事务2在t2时刻读取C=200,在t3时刻事务1执行了更新C的回滚操作,C=100,那么此时就导致事务2读取的C为脏数据。如下图:51Testing软件测试网!G)bL_3F.}K
51Testing软件测试网x7d@O7QP*?(lw
产生以上问题的原因:由于事务的并发破坏了事务的隔离性,导致各个事务并发出现干扰,要想是事务能达到隔离特性,就需要串行调度,也就是某一时刻只能有一个事务完成,其它事务等待。51Testing软件测试网
dWWUal1no/nv
51Testing软件测试网%j},l;o"fC5T 封锁解决并发问题
dtL6p
r'PR0
Sq!DI+Ib
G0 封锁:是事务T在对某个数据操作时,例如,对表、记录等操作之前,先向系统发出请求,对其加锁,加锁后事务T就对该数据拥有了一定的控制,在事务T没有释放它的锁之前,其它事务不能更新该数据
Zy(hiD2]
?d0$b,Q(R\%\(f@0 封锁类型:排它锁(exclusive lock)也成为X锁,共享锁(share lock)也成为S锁。其关系为:对数据加X锁后,其它事务不能加任何锁,对数据加S锁后,其它事务可以加S锁,但不能加X锁。
.q'W7Bj9zD$rO h4u0#F&D:MKL0 采用三级封锁协议解决事务并发产生的问题:
R'^[f0\nE051Testing软件测试网V~mZ'fw (1)一级封锁协议,解决修改丢失问题。描述如下:当事务T在修改数据R之前必须先对其加X锁,直到事务结束。如图:
Na7_7b/v$h3V\!D0