1、在数据库中为什么要并发控制?并发控制技术能保证事务的哪些特性?
数据库是共享资源,通常有多个事务同时运行。当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据地情况。若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。
并发控制可以保证事务的一致性和隔离性。
2、并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况?
并发操作带来的数据不一致包括三类:
丢失数据、不可重复读、读“脏”数据。
避免不一致性的方法就是并发控制。常用的并发控制技术包括封锁方法、时间戳方法、乐观控制方法和多版本并发控制方法等。
3、封锁及其类型:
封锁就是事务T在对某数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后的事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事物不能更新或读取此数据对象。
基本的封锁类型有两种:排他锁(X锁)和共享锁(S锁)。
排他锁又称写锁。若事物T对数据对象A加上X锁,则只允许T读取和修改A,其他事物都不能在对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事物在T释放A上的锁之前不能再读取和修改A。
共享锁又称读锁。若事物T对数据对象A加上S锁,则事物T可以读A但是不能修改A,其他事物只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
4、如何用封锁机制保证数据的一致性?
DBMS在对数据进行读写操作之前首先对该数据执行封锁操作,例如事物T1在对A进行修改之前先对A执行Xock(A),即对A加X锁。这样,当T2请求对A加X锁时就把拒绝,T2只能等待T1释放A上的锁后才能获得对A的X锁,这时它读到的A是T1更新后的值,再按此新的A值进行运算。这样就不会丢失T1的更新。
DBMS按照一定的封锁协议对并发操作进行控制,使得多个并发操作有序地执行,就可以避免丢失修改、不可重复读和读“脏”数据等数据不一致。
5、什么是活锁?活锁产生的原因及解决方法:
当事务T要对数据R加锁时,系统一直没有批准事务T的请求,而使T一直处于等待批准的状态。活锁的含义是该等待事务等待时间太长,似乎被锁住了,实际上可能被激活。
活锁产生的原因:当一系列封锁不能按照其先后顺序执行时,就可能导致一些事务无限期等待某个封锁,从而导致活锁。
避免活锁的简单方法是采用先来先服务策略。
6、什么是死锁?预防死锁的若干办法有:
如果T1封锁了R1,T2封锁了R2,但T1又请求封锁R2,且T2同时请求封锁R1,此时R1和R2已经分别被T1和T2封锁,无法再被封锁,这时T1和T2都陷入互相等待的局面,两事务都不能结束,形成死锁。
防止死锁的方法其实就是破坏产生死锁的条件。预防死锁通常有两种方法:
①一次封锁法:要求事务必须一次将所有要使用的数据全部加锁,否则不能继续执行。
②顺序封锁法:预先对数据对象规定一个封锁顺序,所有事物都按这个顺序实现封锁。
7、给出检测死锁发生的一种方法,当发生死锁后如何解除死锁?
数据库系统一般采用的方法是允许死锁发生,DBMS检测到死锁后加以解除。
DBMS中诊断死锁的方法与操作系统类似,一般使用超时法或事物等待图法。
超时法是指如果一个事物的等待时间超过了规定的时限,就认为发生了死锁。
DBMS并发控制子系统检测到死锁后,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事物,将其撤销,释放此事物持有的所有锁,使其他事物得以继续允许下去。
8、什么样的并发调度是正确的调度?
可串行化的调度是正确的调度。可串行化的调度的定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同,称这种调度策略为可串行化的调度。
9、为什么要引进意向锁?意向锁的含义是什么?
引进意向锁是为了提供封锁子系统的效率。
原因是:在多粒度封锁方法中,一个数据对象可能以两种方式加锁——显示封锁和隐式封锁。因此系统在对某一数据对象加锁时,不仅要检查该数据对象上有无(显示和隐式)封锁与之冲突,还有检查其所有上级结点和所有下级结点,看申请的封锁是否与这些结点上的(显示和隐式)封锁冲突。显然这样的检查方法效率很低。为此引进了意向锁。
意向锁的含义是:对任一结点加锁时,必须对它的上层结点加意向锁。引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级结点的封锁冲突了。
10、IS锁、IX锁、SIX锁:
IS锁:如果对一个数据对象加IS锁,表示对它的后裔结点拟(意向)加S锁。例如:要对某个元组加S锁,则首先要对关系和数据库加IS锁。
IX锁:如果对一个数据对象加IX锁,表示对它的后裔结点拟(意向)加X锁。例如:要对某个元组加X锁,则首先要对关系和数据库加IX锁。
SIX锁:如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。