数据库

用依赖图判断一个调度能不能串行化

「结果等价于某个串行顺序」没法直接检查。实际用的是更保守、但能机械判断的冲突可串行化:

  1. 找出所有冲突对:不同事务、同一个数据、至少一个是写。
  2. 每对画一条边,从先执行的事务指向后执行的。只看先后,不看是读还是写。
  3. 图里没有环,就是冲突可串行化,按拓扑顺序就是等价的串行顺序。有环就不是。

例子:

text
时刻 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 的修改:丢失更新。

我第一次画的时候两条边方向都画反了。记住一句:箭头永远从先发生的指向后发生的。

esc