并发控制阐述
并发操作可能带来哪些数据不一致性?
- 改,改:丢失修改;
- 读,改|删|增:不可重复读;
- 改(后又撤销),读:读’脏‘数据;
并发操作带来数据不一致性的原因?
答:并发操作破坏了事务的隔离性。
并发控制的技术有哪些?
答:封锁、时间戳、乐观控制法、多版本并发控制等。
封锁
所谓封锁就是事务T对某个数据对象操作前对其加锁,在事务T释放锁前,其他任何事务不能更新此数据对象。锁分为排他锁和共享锁。
- 排他锁(X锁):事务T对数据对象A加上X锁,则只允许T读取或修改,其他事务不能对其上锁直到T释放对A上的X锁。
- 共享锁(S锁):事务T对数据对象A加上S锁,则T可以读取但不能修改A,其他事务只能再对A加S锁,而不能加X锁。
同一数据对象A,XX、XS、SX是不相容的。
什么是封锁协议?
答:对运用X锁和S锁约定的一些规则。
- 一级封锁协议:事务T在修改数据A前必须先对其加上X锁,直到事务结束再释放。(防止丢失修改,不保证可重复读和读’脏数据‘)
- 二级封锁协议:在一级基础上,在事务T读取A之前必须先对其加上S锁,读完后即可释放S锁。(防止丢失修改和读’脏数据‘)
- 三级封锁协议:在一级基础上,在事务T读取A之前必须先对其加上S锁,事务结束才可释放S锁。
什么是死锁和活锁?
答:活锁是因为多个事务T对同一个数据A处理,排队中有一个名次不靠后却陷入漫长等待的情形。解决方法是采用先来先服务的策略;死锁是指两个事务互相等待的情形。
如何应对死锁?
答:超时法和事务等待图法来诊断死锁并解除它。
什么样的并发调度是正确的调度?
答:可串行化( Serializable )的调度是正确的调度。可串行化的调度的定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行执行它们时的结果相同,称这种调度策略为可串行化的调度。
什么是两段锁协议?
答:用于实现并发调度的可串行性,从而保证调度的正确性。事务遵守两端协议是可串行化调度的充分条件,所谓两段的含义是将事务分成两个阶段;
- 扩展阶段:获得封锁;
- 收缩阶段:释放封锁;
什么是封锁的粒度?
答:封锁对象的大小叫封锁粒度,封锁对象可以是逻辑单元(属性值、属性值的集合、元组、关系、索引项、数据库),也可以是物理单元(页、物理记录)。封锁粒度越大,并发度越小,开销也越小。
什么是多粒度封锁?
答:一个系统同时支持多种封锁粒度供不同的事务选择,一个结点加锁意味着这个结点的所有后裔结点也被加上同样类型的锁。
什么是显示封锁和隐式封锁?
答:二者运用于多粒度封锁,显示封锁表示应事务的要求直接加到数据对象上的锁,隐式封锁表示该数据对象没有被单独加锁,是由于上级结点枷锁而使该数据对象加了锁。
什么是意向锁?
答:引进意向锁是为了提高封锁子系统的效率,对任一结点加锁时,必须先对它的上层结点加意向锁。
- IS锁:如果对一个数据对象加 IS 锁,表示它的后裔结点拟(意向)加 S 锁。
- IX 锁:如果对一个数据对象加 ix 锁,表示它的后裔结点拟(意向)加 X 锁。
- SIX 锁:如果对一个数据对象加 SIX 锁,表示对它加 S 锁,再加 IX 锁。