事务锁定 2 算法是否可序列化



考虑两个线程 A 和 B

  • A.readset 与 B.writeset 相交
  • B.读取集不与 A.写集相交
  • A.写
  • 集不与 B.写集相交
它们同时提交:A.lock --> A.validation -->

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( (与串行执行的结果相同(

最新更新