You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求提供可串行化但非冲突可串行化的调度示例

可串行化但非冲突可串行化的调度示例

嘿,这有一个经典的例子能清晰展示这类调度的区别,先看三个事务的操作:

  • T1:写数据项B (W1(B)),写数据项A (W1(A))
  • T2:写数据项A (W2(A)),写数据项B (W2(B))
  • T3:读数据项A (R3(A)),读数据项B (R3(B))

我们的调度 S 执行顺序如下:

W1(B), W2(A), R3(A), R3(B), W1(A), W2(B)

为什么它是可串行化调度?

可串行化调度要求存在一个串行调度,与当前调度视图等价。我们看串行调度 T1 → T2 → T3,它的执行顺序是:

W1(B), W1(A), W2(A), W2(B), R3(A), R3(B)

对比两个调度,满足视图等价的三个核心条件:

  1. 初始读一致性:T1、T2都是直接写数据,没有读取初始值;T3在调度S中读A的值来自T2的写入,读B的值来自T1的写入,这和串行调度T1→T2→T3中T3的读取来源完全一致。
  2. 写-读依赖一致:所有读操作依赖的写事务在两个调度中完全匹配。
  3. 最后写事务一致:数据项A的最后写入者是T1,数据项B的最后写入者是T2,两个调度完全相同。

因此调度S与串行调度T1→T2→T3视图等价,属于可串行化调度。

为什么它不是冲突可串行化调度?

冲突可串行化要求调度与某个串行调度冲突等价,判断依据是冲突图是否存在环(冲突操作指不同事务对同一数据的读-写、写-读、写-写操作)。

我们列出调度S中的所有冲突操作及对应的依赖边:

  • W1(B) 和 W2(B):写-写冲突,依赖边 T1 → T2(T1先写B,T2后写B,不能交换顺序)
  • W1(B) 和 R3(B):写-读冲突,依赖边 T1 → T3
  • W2(A) 和 W1(A):写-写冲突,依赖边 T2 → T1(T2先写A,T1后写A,不能交换顺序)
  • W2(A) 和 R3(A):写-读冲突,依赖边 T2 → T3
  • W1(A) 和 R3(A):写-读冲突,依赖边 T3 → T1(T3先读A,T1后写A,不能交换顺序)
  • W2(B) 和 R3(B):写-读冲突,依赖边 T3 → T2(T3先读B,T2后写B,不能交换顺序)

现在冲突图中出现了循环,比如 T1 → T2 → T1,这说明调度S无法通过交换非冲突操作转换为任何串行调度,因此它不属于冲突可串行化调度。

内容的提问来源于stack exchange,提问作者M H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:26:55