目录
前言
本文为JMU22级数据库原理考前复习而总结归纳,刨除了课本以及课堂上晦涩且长篇大论的文章,以尽量简洁易懂的语句来对知识点进行归纳。
继 上一篇文章 关于文章末尾提到的“诊断-解除法”接着对并发控制进行归纳总结。
关于并发控制,还会有一篇文章介绍“封锁粒度”的相关内容。
死锁解决方法
超时等待法
先设置规定的时限,一旦有事务超过期限,就认为它处于死锁状态,然后就撤销它。
缺点:如果一个事务过长,会被误判。
等待图法
所有事务作为图节点,如果是事务T1等待事务T2,就画一条T1指向T2的有向边。出现回路就是互相等待,就是死锁。就会撤销。
缺点:维护和判断回路的开销很大。
这两种方法都是撤销代价最小的事务。
串行化
概念
多个事务并行执行的结果如果正确,应该与串行执行操作的结果一样。这样的并行就是可串行化调度。
也可以说可串行性是判断并行调度正确性的准则。
验证串行化
冲突可串行化是串行化的充分条件。(不是必要条件)
冲突是指:不同事务对同一数据对象同时进行写写或读写操作。
判断冲突可串行化
交换不冲突的事务,且保持冲突操作次序不变。如果最后能够变为串行调度,则可串行化,所以存在正确的并发调度方法。
- 注意,串行化这个词蕴含着,事务各个操作的顺序不能改变。
举例
现有一个调度序列:r1(A)w1(A) r2(A)w2(A) r1(B)w1(B) r2(B)w2(B)
r1(A)代表,事务1对数据对象A进行读操作。
分析该序列,是事务1和2并行对数据对象A和B进行读写操作。
事务1:r1(A)w1(A)r1(B)w1(B)
事务2:r2(A)w2(A)r2(B)w2(B)
所以要想办法通过交换不冲突的事务来串行化,注意到事务1在第一位置,所以接下来就尝试按先1后2来串行。所以要把2换到后面。
为了保证可串行而出现的封锁协议--两段锁协议
概念
两段锁协议就是事务加锁解锁构成的整个操作序列,一定要是先加锁后解锁,不能加锁和解锁混杂。并且对任何读写操作都要加锁。
两段锁协议是可串行化调度的充分条件(非必要)。
与一次封锁的区别
一次封锁是事务开头全部加锁。导致成为串行。
两段锁是操作之前加锁。有一定程度的并行。