1.为什么要并发控制?并发控制技术能保证事务的哪些特性?
数据库共享资源,通常有许多个事务同时在运行。若对并发操作不加控制,多个事务就可能会存取和存储不正确的数据,破坏数据库的一致性。
并发控制技术能保证事务的隔离性和一致性。
2.并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况?什么是封锁?
数据不一致性包括:
丢失修改:两事务T1和T2读入同一数据并修改,T2的结果覆盖T1的结果
不可重复读:T1读取后,T2修改,T1无法再现之前读取的结果
读“脏”数据:T1修改后写回磁盘,T2读取后,T1被撤销,数据恢复原值,T2读取的数据与数据库的不一致。
避免不一致的方法和技术就是并发控制。
最常用的是封锁技术。事务对某个数据对象操作之前,先向系统发出加锁请求,在事务释放它之前,其他事务就不能更新它。
3.三级封锁协议、两阶段封锁
不同封锁协议与系统一致性级别的关系?如何用封锁机制保证数据的一致性?
三级封锁协议---保证数据一致性
1级封锁协议
事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
1级封锁协议可防止丢失修改,并保证事务T是可恢复的。
如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。
2级封锁协议
1级封锁协议 + 事务T在读取数据R前必须先对其加S锁,读完释放S锁
2级封锁协议可以防止丢失修改和读“脏”数据
由于读完数据后即可释放S锁,所以它不能保证可重复读
3级封锁协议
1级封锁协议 + 事务T在读取数据R前必须先对其加S锁,事务结束才释放
3级封锁协议可防止丢失修改、读脏数据和不可重复读
两段锁协议---保证并行调度可串行性
内容:
– 1. 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
– 2. 在释放一个封锁之后,事务不再获得任何其他封锁
⁻ 第一阶段是获得封锁,也称为扩展阶段;
⁻ 第二阶段是释放封锁,也称为收缩阶段。
⚫ 事务遵守两段锁协议→(充分条件)可串行化调度→并行执行的结果一定是正确的
4.什么样的并发调度是正确的调度?
可串行化的调度是正确的调度。
可串行化的调度的定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行执行的结果相同。
5.什么是封锁?基本的封锁类型有几种?什么是封锁粒度?
封锁:事务对某个数据对象操作之前,先向系统发出加锁请求,在事务释放它之前,其他事务就不能更新它。
类型
– 排它锁(eXclusive lock,X锁,写锁)
只允许事务T1读取和修改A,其他事务不可再加锁
– 共享锁(Share lock,S锁,读锁)
其他事务可以再加S锁(读锁)。
X锁和S锁都是加在某一个数据对象上的,封锁的数据对象可以是逻辑单元,也可以是物理单元
封锁对象的大小称为封锁的粒度
6.什么是活锁?试述活锁的产生原因和解决方法。
活锁:某个事务永远处于等待状态,得不到封锁的机会。
原因:当一系列封锁不能按照其先后顺序执行时,就可能导致一些事务无限期等待某个封锁,从而导致活锁。
避免方法:采用先来先服务的策略。
7.什么是死锁?请给出预防死锁的若干方法。
死锁:多个事务都已封锁了一些数据对象,然后又都请求对已被其他事务封锁的数据对象加锁,从而出现了死等待(相互等待)。
预防方法:破坏产生死锁的条件。
一次封锁法:
每个事务必须一次加锁所有要使用的数据。
扩大了封锁范围,降低了并发度。难以精确确定封锁对象
顺序封锁法:
预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
成本高。难于实现。
8.请给出检测死锁发生的一种方法,当发生死锁后如何解除死锁?
超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。 实现简单,
但有可能误判死锁;
若时限设置得太长,又不能及时发现死锁发生。
事务等待图法:并发控制子系统周期性地检测事务等待图,如发现图中存在回路,则表示系统中出现了死锁。
DBMS并发控制子系统检测到死锁后,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有锁。当然,对撤销的事务所执行的数据修改操作必须加以恢复。
9.为什么要引进意向锁?意向锁的含义是什么?
原因:在多粒度封锁方法中一个数据对象可能以两种方式加锁——显式封锁和隐式封锁。因此系统在对某一数据对象加锁时要检查该数据对象和其所有上、下级结点,看申请的封锁是否有封锁冲突,效率低。
意向锁:对任一结点加锁时,必须先对它的上层结点加意向锁。
引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级结点的封锁冲突了。提高效率
10.试述常用意向锁:IS锁、IX锁、SIX锁,给出 锁的相容矩阵。
IS锁:它的后裔结点拟(意向)加S锁。例如,要对某个元组加S锁,则要首先对关系和数据库加IS锁。
IX锁:它的后裔结点拟(意向)加X锁。例如,要对某个元组加X锁,则要首先对关系和数据库加IX锁。
SIX锁:对它加S锁,再加IX锁,即SIX = S + IX。