码迷,mamicode.com
首页 > 数据库 > 详细

数据库-封锁协议

时间:2020-05-09 09:18:12      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:特定   串行化   解锁   改变   不能   丢失   结果   mys   不可   

1.三级封锁协议

一级封锁协议

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

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

二级封锁协议

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

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

三级封锁协议

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

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

 

2.两段锁协议

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

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


 

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

数据库-封锁协议

标签:特定   串行化   解锁   改变   不能   丢失   结果   mys   不可   

原文地址:https://www.cnblogs.com/conanpeng/p/12854299.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!