- 每种锁协议都不是万能的;
- 存在不遵守两阶段锁协议的可冲突化调度;
描述
要求每个事务分别在两个阶段发出加锁和解锁请求:
- 成长阶段
获取锁,但不释放任何锁; - 收缩阶段
释放锁,但不再获取任何锁
最初,一个事务处于成长阶段:该事务按需获取锁。
一旦该事务释放了一个锁,则该事务就进入收缩阶段,不再发出任何锁请求。
性质
基础版两阶段锁协议保证了冲突可串行化
-
可能会发生死锁
-
可能会发生联级回滚
- 如果事务在事务执行
read(A)
后失败了,就会引发事务和事务的联级回滚;
- 这类联级回滚可通过
strict
两阶段锁协议和rigorous
两阶段锁协议得到清除;
- 如果事务在事务执行
示例
非两阶段锁示例
事务
T1: lock-X(B);
read(B);
B := B − 50;
write(B);
unlock(B);
lock-X(A);
read(A);
A := A + 50;
write(A);
unlock(A).
事务
T2: lock-S(A);
read(A);
unlock(A);
lock-S(B);
read(B);
unlock(B);
display(A + B).
两阶段锁示例
事务
T3: lock-X(B);
read(B);
B := B − 50;
write(B);
lock-X(A);
read(A);
A := A + 50;
write(A);
unlock(B);
unlock(A).
事务
T4: lock-S(A);
read(A);
lock-S(B);
read(B);
display(A + B);
unlock(A);
unlock(B).