multithreading - 事务锁定2算法可序列化吗?

标签 multithreading transactions multiprocessing stm

考虑两个线程A和B

  • A.readset与B.writeset相交
  • B.readset不与A.writeset相交
  • A.writeset不与B.writeset相交

  • 他们在同一时间提交:A.lock-> A.validation-> B.lock-> B.validation->(AB安装更新)

    这不是可序列化的,因为B在A提交之前可能会覆盖A的读取吗?

    最佳答案

    它的可序列化的,因为写入事务A的writeset的值取决于在验证过程中确认的A的readset的缓存的值。 B覆盖A的readset不会影响A的写入所基于的A的readset的缓存值。写入事务A的writeset的值与如果事务A在事务B开始之前运行完成时要写入的值完全相同,因此它是可序列化的。

    示例

    我们有一个事务性存储器,包含3个变量X,Y,Z = X1,Y1,Z1

    事务A读取X,然后将Y写入取决于X的值(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的readset X)
  • 事务A:设置Y = X1 + P并提交(使用X的缓存值而不是最新值)
  • 最终结果:(X,Y,Z)=(Z1 + Q,X1 + P,Z1)(与串行执行相同的结果)
  • 关于multithreading - 事务锁定2算法可序列化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27453984/

    相关文章:

    multithreading - 在golang中并行递归扫描树

    c# - 在 SqlBulkCopy 中使用 NHibernate 事务

    python - ndb.toplevel 会破坏交易吗?

    javascript - inpage.js :1 Uncaught Error: invalid address

    caching - MESI 协议(protocol)理解状态转换

    python - 遇到同时连接到多个设备的多线程问题

    Java + Redis Pub/Sub - 帮助选择一个好的 Worker 实现

    python - 当所有进程都尝试从队列中获取数据并且队列为空时结束处理吗?

    multithreading - TThread.OnTerminate执行线程