数据库-封锁协议


1.三级封锁协议

一级封锁协议

事务在修改数据时必须先加X锁,在事务结束之后释放X锁

这样可以解决丢失修改的问题。因为不能有两个事务同时修改同一个数据,所以不会有修改被覆盖的问题。

二级封锁协议

在一级的基础上,要求读取数据A之前必须加上S锁,读取A之后立即释放S锁

这样可以解决读脏数据的问题。因为一个事务如果对A进行修改,必须先加X锁。其他事务就不能在数据A上加S锁,就不能读取A,也就不会读到脏数据。

三级封锁协议

在二级的基础上,要求在读取数据A之前加上S锁,在事务结束之后再释放S锁

这样可以解决不可重复读的问题。因为在事务结束前,数据A上一直有S锁,其他事务不能再在A上加X锁来修改A,在读取期间数据的值不会发生改变。

 

2.两段锁协议

加锁和解锁分两个阶段进行

两段锁协议可以解决幻影读的问题。事务遵循两段锁协议是可串行化调度的充分非必要条件。可串行化调度是指,通过并发控制,使得事务并发执行的结果和某个串行执行事务的执行结果相同。串行执行的事务之间互不干扰,不会有并发一致性问题。


 

MySQL的InnoDB引擎采用两段锁协议,会根据隔离级别在需要的时候自动加锁,在同一时刻释放所有锁,这被称为隐式锁定。InnoDB也有特定的语句进行显式锁定。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM