数据库

可串行化,不保证结果只有一种

我一开始的理解是:串行化就是保证「不管谁先谁后,结果都一样」。这是错的。

A、B 两个账户各 1000。T1:A 转 100 给 B。T2:两个账户各加 6% 利息。

顺序AB总额
T1 → T295411662120
T2 → T196011602120

两种结果不同,但都对。可串行化只要求:并发交错执行的结果,等价于某一种串行顺序。是哪一种,数据库不承诺。

错的是两种串行顺序都给不出的结果。比如给 A 计息时已经扣了 100、给 B 计息时还没加上那 100,总额就变成 2114。

为什么只要「某一种」?事务同时到达时本来就没有先后之分,不指定顺序,数据库才有调度的自由。

这个标准是定义而不是定理:假设每个事务单独跑都能把合法状态变成合法状态,那任何串行顺序都合法,等价于其中一种的交错执行自然也合法。好处是数据库不用懂业务规则就能判断对错。

esc