数据库的并发控制
1. 并发一致性可能导致的问题:
- 丢失修改(在事务A对某个特定数据修改过后,事务B再次修改,使得并发执行的事务A再次执行时,对应的数据不再是之前修改的那个)
- 读脏数据(在事务A对某个数据修改过后,事务B读取这个数据,但是由于某些缘故,事务A可能发生回滚,这就会导致A对于B读取的那个数据前的修改不作数,B读到的是脏数据)
- 不可重复读(事务A在读取某个特定数据后,事务B对这个数据做更新,使得A在对这个数据再次读取时结果和第一次不一样)
2. 解决并发一致性问题(封锁)
- 写锁(X锁、排他锁)
- 读锁(S锁、共享锁)
- 意向锁(对于封锁粒度小的对象加锁时,需要对其上一层的对象加上意向锁)
封锁的粒度:
- 包括逻辑单元,比如属性列,属性列的集合,关系表,元组等,
- 或是物理单元:页、物理记录等
三级封锁协议:
- 一级封锁协议:修改数据时必须加X锁,等到事务结束后马上解除
- 二级封锁协议:在一级封锁协议的基础上,读数据的时候加S锁,读取结束撤销
- 三级封锁协议:在一级封锁协议的基础上,读数据的时候加S锁,事务结束时撤销
一级封锁协议下,解决了丢失修改的问题,但没能解决读脏数据和不可重复读的问题
二级封锁协议下,不仅可以处理丢失修改的问题,还可以处理读脏数据的问题,但是对于不可重复读的问题无能为力
三级封锁协议下,可以解决并发一致性的三大问题
两段封锁协议:对于所有并发的事务,分两个阶段进行加锁和释放锁,在第一阶段,集中进行加锁,这段时间称为扩展阶段,在此之后,在第二阶段内集中进行解锁,这段时间称为收缩阶段。通过两段锁协议,实现可串行化调度(也就是说,事务并发执行的次序下,得出的结果和串行执行事务的结果一样)。