mysql中的两段锁协议和三级封锁协议
两段锁协议
一个事务中一旦开始释放锁,就不能再申请新锁了。事务的加锁和解锁严格分为两个阶段,第一阶段加锁,第二阶段解锁。
目的 :”引入2PL是为了保证事务的隔离性,保证并发调度的准确性,多个事务在并发的情况下依然是串行的。
封锁定理:
如果事务是良构的且是两阶段的,那么任何一个合法的调度都是隔离的。
2PL和2PC
**2PL,两阶段加锁协议:主要用于单机事务中的一致性与隔离性。**主要是在MySql(仅限innodb)中使用的。
2PC,两阶段提交协议,用于分布式事务。
S2PL(Strict 2 PL)
SQL是千变万化、条数不定的,数据库很难在事务中判定什么是加锁阶段,什么是解锁阶段。因此规定:
- 在事务中只有提交(commit)或者回滚(rollback)时才是解锁阶段,
-
其余时间为加锁阶段。
两阶段加锁对数据库性能的影响详见该文章(很好的文章,仔细看看):https://blog.****.net/qq4165498/article/details/76855139
封锁协议:
运用X锁和S锁对数据对象进行加锁时约定的规则就是封锁协议。
目的是在不同程序上保证数据的一致性。
三级封锁协议
- 一级封锁:修改数据加x锁直到事务结束才释放。在此协议中,仅仅是读数据是不需要加锁的,所以只能解决丢失修改问题,不能解决脏读和不可重复读。
- 二级封锁:在一级封锁的基础上,加了一条:T事务在读取数据R之前必须先对其加上S锁,读完释放S锁。可以解决丢失修改和脏读(加了读锁就可以防止在读的期间其他事务进行修改,但是读完之后,事务结束之前,依然可能会其他事务进行修改,导致不可重复读)。
- 三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。:解决了丢失修改、脏读和不可重复读的问题。