用依赖图判断一个调度能不能串行化
「结果等价于某个串行顺序」没法直接检查。实际用的是更保守、但能机械判断的冲突可串行化:
- 找出所有冲突对:不同事务、同一个数据、至少一个是写。
- 每对画一条边,从先执行的事务指向后执行的。只看先后,不看是读还是写。
- 图里没有环,就是冲突可串行化,按拓扑顺序就是等价的串行顺序。有环就不是。
例子:
时刻 1 T1 读 A
时刻 2 T2 读 A
时刻 3 T1 写 A
时刻 4 T2 写 A- 2 → 3:T2 读、T1 写,画 T2 → T1
- 3 → 4:两次写,画 T1 → T2
只看 A 就成环了,不可串行化。如果两个事务都是「读余额、加 100、写回」,结果就是 T2 用旧值覆盖了 T1 的修改:丢失更新。
我第一次画的时候两条边方向都画反了。记住一句:箭头永远从先发生的指向后发生的。