mysql中的两段锁协议和三级封锁协议

两段锁协议

一个事务中一旦开始释放锁,就不能再申请新锁了。事务的加锁和解锁严格分为两个阶段,第一阶段加锁,第二阶段解锁。

目的 :”引入2PL是为了保证事务的隔离性,保证并发调度的准确性,多个事务在并发的情况下依然是串行的。

封锁定理:

如果事务是良构的且是两阶段的,那么任何一个合法的调度都是隔离的。

2PL和2PC

**2PL,两阶段加锁协议:主要用于单机事务中的一致性与隔离性。**主要是在MySql(仅限innodb)中使用的。
2PC,两阶段提交协议,用于分布式事务。

S2PL(Strict 2 PL)

SQL是千变万化、条数不定的,数据库很难在事务中判定什么是加锁阶段,什么是解锁阶段。因此规定:

  1. 在事务中只有提交(commit)或者回滚(rollback)时才是解锁阶段,
  2. 其余时间为加锁阶段。
    mysql中的两段锁协议和三级封锁协议
    两阶段加锁对数据库性能的影响详见该文章(很好的文章,仔细看看):https://blog.****.net/qq4165498/article/details/76855139

封锁协议:

运用X锁和S锁对数据对象进行加锁时约定的规则就是封锁协议。

目的是在不同程序上保证数据的一致性。

三级封锁协议

  1. 一级封锁:修改数据加x锁直到事务结束才释放。在此协议中,仅仅是读数据是不需要加锁的,所以只能解决丢失修改问题,不能解决脏读和不可重复读。
  2. 二级封锁:在一级封锁的基础上,加了一条:T事务在读取数据R之前必须先对其加上S锁,读完释放S锁。可以解决丢失修改和脏读(加了读锁就可以防止在读的期间其他事务进行修改,但是读完之后,事务结束之前,依然可能会其他事务进行修改,导致不可重复读)。
  3. 三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。:解决了丢失修改、脏读和不可重复读的问题。