考虑两个线程 A 和 B
- A.readset 与 B.writeset 相交
- B.读取集不与 A.写集相交 A.写
- 集不与 B.写集相交
B.lock --> B.validation -->(A B 安装更新(
这是否不可序列化,因为 B 可能会在 A 提交之前覆盖 A 的读取?
它是可序列化的,因为写入事务 A 的写集的值取决于在验证期间确认的 A 读取集的缓存值。B 覆盖 A 的读取集不会影响 A 的写入所基于的 A 读取集的缓存值。写入事务 A 的写集的值与事务 A 在事务 B 开始之前运行到完成时写入的值完全相同,因此它是可序列化的。
例
我们有一个事务内存由 3 个变量 X、Y、Z = X1、Y1、Z1 组成
事务 A 读取 X 并使用取决于 X 的值写入 Y (X + P(事务 B 读取 Z 并写入 X 的值取决于 Z (Z + Q(
序列化执行
- 事务 A:锁定 Y,验证 X = X1。
- 事务 A:设置 Y = X1 + P 并提交。
- 事务 B:锁定 X,验证 Z = Z1。
- 事务 B:设置 X = Z1 + Q 并提交
- 最终结果: (X, Y, Z( = (Z1 + Q, X1 + P, Z1(
交错执行
- 事务 A:锁定 Y,验证 X = X1。
- 事务 B:锁定 X,验证 Z = Z1。
- 事务 B:集合 X = Z1 + Q 并提交(在 A 提交之前写入 A 的读取集 X(
- 事务 A:设置 Y = X1 + P 并提交(使用 X 的缓存值而不是最新值(
- 最终结果:(X, Y, Z( = (Z1 + Q, X1 + P, Z1( (与串行执行的结果相同(