数据库系统概论(第5版) 王珊 萨师煊 第11章课后习题
2.并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况?
- 丢失修改(Lost Update)
- 不可重复读(Non-repeatable Read)
- 读“脏”数据(Dirty Read),即:不正确的数据
解决方法:并发控制机制,主要技术有封锁,时间戳,乐观控制法和多版本并发控制等
3.什么是封锁?基本的封锁类型有几种?试述他们的含义
答:封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象。
- 排它锁(Exclusive Locks,简记为X锁,写锁)
若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁为止。保证其他事务在T释放A上的锁之前不能再读取和修改A - 共享锁(Share Locks,简记为S锁,读锁)
若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改
6.什么是死锁?请给出预防死锁的若干方法
如果事务T1封锁了数据R1, T2封锁了数据R2:然后T1又请求封锁R1,因T2已封锁了R2于是T1等待T2释放R2上的锁;接者T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。这样就出现了T1在等待T2而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。
- 一次封锁法
- 顺序封锁法
10.今有三个事务的一个调度r3(B)r1(A)w3(B)r2(B)r2(A)w2(B)r1(B)w1(A),该调度是冲突可串行化的调度吗?为什么?
- 由于r1(A)和w3(B)是不冲突操作,交换r1(A)、w3(B),可得
r3(B)w3(B)r1(A)r2(B)r2(A)w2(B)r1(B)w1(A) - 由于r1(A)和r2(B)r2(A)w2(B)是不冲突操作,交换,可得
r3(B)w2(B)r2(B)r2(A)w2(B)r1(A)r1(B)w1(A)是一个串行调度
所以原调度是冲突可串行化调度。
14.考虑T1和T2两个事务。
T1: R(A); R(B);B=A+B; W(B)
T2:R(B); R(A);A=A+B; W(A)
(1)改写T1和T2,增加加锁操作和解锁操作, 并要求遵循两阶段封锁协议。
(2)说明T1和T2的执行是否会引起死锁,给出T1和T2的一个调度并说明之
会引起死锁