数据库-封锁协议
1.三级封锁协议
一级封锁协议
事务在修改数据时必须先加X锁,在事务结束之后释放X锁。
这样可以解决丢失修改的问题。因为不能有两个事务同时修改同一个数据,所以不会有修改被覆盖的问题。
二级封锁协议
在一级的基础上,要求读取数据A之前必须加上S锁,读取A之后立即释放S锁。
这样可以解决读脏数据的问题。因为一个事务如果对A进行修改,必须先加X锁。其他事务就不能在数据A上加S锁,就不能读取A,也就不会读到脏数据。
三级封锁协议
在二级的基础上,要求在读取数据A之前加上S锁,在事务结束之后再释放S锁。
这样可以解决不可重复读的问题。因为在事务结束前,数据A上一直有S锁,其他事务不能再在A上加X锁来修改A,在读取期间数据的值不会发生改变。
2.两段锁协议
加锁和解锁分两个阶段进行。
两段锁协议可以解决幻影读的问题。事务遵循两段锁协议是可串行化调度的充分非必要条件。可串行化调度是指,通过并发控制,使得事务并发执行的结果和某个串行执行事务的执行结果相同。串行执行的事务之间互不干扰,不会有并发一致性问题。
MySQL的InnoDB引擎采用两段锁协议,会根据隔离级别在需要的时候自动加锁,在同一时刻释放所有锁,这被称为隐式锁定。InnoDB也有特定的语句进行显式锁定。