在学习两阶段锁的时候,第一遍懵懵懂懂,勉强记了下来,等到第二遍复习的时候,发现全部忘掉了,所以决定要理解,要理解,要理解!!!
不能死记硬背,虽然对于应付考试可能有点帮助,但是长远来看,还是要理解!!!
本文重点讨论关于三种两段锁协议对于并发问题的解决。
两阶段锁有三个阶段:
两阶段锁协议、严格两阶段锁协议和强两阶段锁协议。
这三个阶段是不断增强的,目的是解决并发过程中出现的各种问题。
两阶段锁协议:指所有事务分两个阶段提出加锁和解锁申请
·增长阶段:对任何数据进行读写操作之前,首先申请并获得该数据的封锁。
·收缩阶段:在释放一个封锁后,事务不再申请和获得其他的任何封锁。
严格两阶段锁协议:
除了满足两阶段锁协议规定外,还要求事务的排它锁必须在事务提交之后释放。
强两阶段锁协议:
除了满足两阶段锁协议外,还要求所有锁都必须在事务提交之后释放。
关于三种两阶段锁的作用分析:
·两阶段锁:是保证冲突可串行化的充分条件。
举例:当一个调度中有连续的R1(A)W2(A)时,说明事务1已经UNLOCK A的锁了,(因为W2(A)需要申请排它锁,必须等事务1释放A的锁)并且不再申请其他锁,则事务1和2不会有冲突的动作,即冲突可串行化。
·严格两阶段锁:解决了级联回滚的问题;避免了脏读和丢失修改的问题。
级联回滚一般是由脏读引起的,所以解决脏读问题也就解决了级联回滚问题。
脏读是由于读了由其他事务更新得到的数据,而这个数据的更新还没有提交。
严格两阶段锁要求排它锁在事务提交后释放锁。而对于数据的更新要申请排它锁,对数据更新后提交事务再释放排它锁,这时其他事务才能申请锁来进行数据读取,而此时读取的数据就不再是脏数据。
解决丢失修改问题也是同理,在一个事务更新数据并提交后,其他事务才能申请锁进行更新提交,即前一个更新虽然被覆盖,但是并不是丢失。
·强阶段锁协议:进一步解决数据项不能重复读的问题。
这个一直想不通为什么 ,还请各位解答www