1.数据库中为什么要采用并发控制?并发控制技术能保证事务的哪些特性?
因为多个事务的并发操作会对数据库产生影响,当多个事务同时访问一个数据时就会互相干扰。并发控制技术能保证事务的一致性,隔离性。一致性是指事务要么全部运行完毕,要么进行回滚操作,拒绝执行。隔离性是指当一个事务正在访问一个数据段时,不允许其它事务访问此数据段。
2.并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况?
1.丢失修改:举个例子就是有数据A,分别被事务1,事务2读入进行修改,事务1修改数据过后,提交修改。事务2修改数据后提交修改比事务1要晚,所以事务2的数据破坏了事务1的结果。
2.脏读:若有事务A修改某一个数据并将其写回磁盘,然后事务B读取了这个数据,但是在事务B读取此数据后,事务A发生错误然后回滚,这时事务B读取到的数据就是不正确的,所以说是脏事务。
3.不可重复读:举个例子:当事务A读取数据1后,事务B也读取了数据1并进行更改,此后事务A再次读取数据1发现读取的值和之前的值不一样。
4.幻读:当事务A读取某些数据记录后,事务B执行插入或删除操作,让事务A无法再现前一次读取结果。
3.事务的隔离级别都有哪些,事务隔离级别与数据一致性的关系是什么?
隔离级别有:读未提交,读已提交,可重复读,可串行化。
事务隔离级别与数据一致性关系:
根据表的内容再理解四个隔离级别:
读未提交:事务A在对数据进行处理时,事务B对数据进行读取。导致脏读就是B读取了一次A修改后的值,然后A回滚导致脏读。B读取了修改前的值,A作修改,B再次读取时发现两次的值不一样。当B先读取了一部分数据,A进行了增或删导致幻读。
读已提交:指一个事务可以读取其它事务已经提交的结果。
可重复读:指的是当一个事务再读取数据时,其它事务不能够对此数据进行UPDATE操作,所以脏读和不可重复读都被避免。但是此时仍然可以更新和删除。
可串行化:可以完全避免上述问题。
4.什么是封锁?基本的封锁类型有几种?说明它们的含义。
排它型锁:叫写锁(X锁)若事务T对数据A加上X锁后,则只允许事务T读取和修改A,其它事务不能再对A加任何锁。换句话说避免其它事务对A进行读取和修改。
共享型锁:叫读锁(S锁)若事务T对数据A加上X锁后,则只允许事务T读取A,其它事务可以对A再加读锁,但不能对A做任何修改。
5.如何用封锁机制保证数据的一致性?
先了解封锁协议的概念:何时申请锁,持续时间,何时释放,这些规则被称为封锁协议。
6.什么是活锁?说明活锁的产生原因和解决办法。
活锁:一个事务(进程)被永远地搁置,而无法访问数据资源,也就是说没有被系统调度到。
产生原因:有事务1,2,3,4,5然后事务1在加了锁给数据A,2也要对A加锁但是处于等待,当1释放锁后,正好3,4,5来加锁,让2一直被搁置。
解决办法:先来先服务策略。
7.什么是死锁?请给出预防死锁的若干办法。
发生死锁的必要条件:
1.资源互斥
2.不可抢占资源
3.在占有资源后还能够申请别人的资源。
4.形成环路。
预防死锁办法:
1.一次封锁法:将所有要使用的资源给全部加锁。缺点是:难以预料到全部加锁资源,扩大了加锁范围使得程序并发度降低。
2.顺序封锁法:就是说给资源编号然后按照编号的顺序去对资源加锁,实现破坏死锁产生必要条件中的环路等待条件。
8.举例检测死锁发生的一种方法。当发生死锁后如何解除死锁?
检测死锁并解除死锁方法是数据库中普遍采用的方法。检测死锁的方法有:
1.超时法:如果一个事务等待时间过长那么就判定产生了死锁,不过该方法容易产生误判。
2.有向图法:将所有节点抽象出来,加上有向边然后通过检查是否存在回路来判断是否发生死锁。
解除方法:
1.杀死环路中的一个事务。
2.用记录点记录下某个节点,然后回滚到这个记录点下的状态。
9.什么样的并发调度是正确的调度?
串行调度是正确的,执行结果等价于串行调度的调度也是正确的。这样的调度称之为可串行化调度。
解释概念:
可串行化调度:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同。
正确调度:一个给定的并发调度,当且仅当它是可串行化的。
冲突操作:指的是不同事务对同一个数据进行读写或写写操作。
可串行化调度的充分条件:将一个调度保障冲突操作次序不变下,交换两个事务不冲突操作,然后若交换后的调度是一个可串行化调度,那么交换前的调度也是一个可串行化调度。
10.证明若并发事务遵守两段锁协议,则对这些事务的并发调度是可串行化的。
判断了怎么样是一个可串行调度后,还需要给出实现可串行化的方法:两段封锁协议来实现并发调度的可串行性。
两段锁:指的是所有事务必须分为两个阶段对数据项加锁和解锁。
11.举例说明对并发事务的一个调度是可串行化的,而这些并发事务不一定遵守两段锁协议。
如图是一个可串行化调度,但是却不符合两段锁协议。
通过10和11可以看出遵守两段锁协议是可串行化调度的充分条件,却不是必要条件。此外两段所协议并不是一次封锁协议。一次封锁协议遵守两段锁协议,但是两段锁协议却不完全需要一次性申请所有资源。所以说两段锁协议会引起死锁。
12.为什么要引进意向锁?意向锁的含义是什么?
回答为什么要引进意向锁,要先了解封锁粒度,多粒度封锁,显式封锁,隐式封锁概念。
封锁粒度:封锁的对象大小。
多粒度封锁:是指在一个系统内,事务可以针对不同的对象进行封锁,如对数据库,对元组,对关系。
多粒度树:
显示封锁:对多粒度树上的某一个节点直接加锁
隐式封锁:加锁的节点下的子节点是被隐式加锁了的。
引进意向锁的原因是:当为某个对象加锁,要先检查对象有没有显示封锁发生冲突,然后查看所有上级节点看看有无跟上级节点的隐式封锁冲突,还要检查所有夏季节点看他们的显式封锁是否与本事务的隐式封锁冲突。这样检查效率太低了,所以要引进意向锁。
意向锁的含义:如果对一个节点加意向锁,说明该节点的后裔节点正在被加锁;对任一节点加锁时,必须先对它的上层节点加意向锁。
13.说明常用的意向锁(IS,IX,SIX),给出这些锁的相容矩阵。
IS:意向共享型锁,如果对一个数据对象加IS锁,表示它的后裔节点想要加S锁。
IX:意向排他型锁:如果对一个数据对象加IX锁,表示它的后裔节点想要加X锁。
SIX:共享意向排他型锁:表示先加S锁再加IX锁。对某个表加SIX锁,则表示该事务要读真个表,同时会更新个别元组。
封锁类型相容矩阵: