本文已参与「新人创作礼」活动,一起开启掘金创作之路。
什么是三级封锁协议?
用于规定使用锁实现隔离性时,何时加锁,何时解锁。
- 一级封锁协议:事务在修改数据之前必须先对其加X锁,直到事务结束才释放。可以解决丢失修改问题(两个事务不能同时对一个数据加X锁,避免了修改被覆盖);
- 二级封锁协议:在一级的基础上,事务在读取数据之前必须先加S锁,读完后释放。可以解决脏读问题(若有事务在修改数据,则加了X锁,此时想要读取数据的事务并不能加S锁,也就无法进行读取);
- 三级封锁协议:在二级的基础上,事务在读取数据之前必须先加S锁,直到事务结束才能释放。可以解决不可重复读问题(避免了在事务结束前其它事务对数据加X锁进行修改)
什么是两段锁协议?
事务对数据必须严格按照加锁阶段和解锁阶段两个阶段操作,也就是说一个事务中一旦释放了锁,就不能再申请新锁了。事务遵循两段锁协议是保证可串行化调度的充分条件。
可串行化调度是指通过并发控制使得事务并发执行的结果与事务串行执行的结果相同。
数据库的四种隔离级别?
- 未提交读(Read Uncommited):事务提交前,执行结果对其它事务可见。会导致脏读、幻读、不可重复读;
- 提交读(Read Commited):事物提交前执行结果对其他事物不可见。可避免脏读问题;(MVCC可实现)
- 可重复读(Repeatable Read):可确保事务多次读取同样的数据时得到的结果相同.(默认隔离级别)可避免不可重复读;(MVCC可实现)
- 可串行化(Serializable):强制事务串行执行,使之不可能相互冲突,可避免脏读、幻读、不可重复读问题。会引起锁竞争,使执行效率下降。