precedence graphs在MVCC系统事务可串行化中的应用及疑问
优先图(Precedence Graphs)在MVCC事务可串行化中的应用与Snapshot Isolation解析
一、优先图如何用于MVCC的可串行化研究
优先图(又称冲突图)是分析事务调度可串行性的核心工具:节点代表事务,有向边代表事务间的冲突依赖(rw/wr/ww三种类型)。在MVCC系统中,它的价值体现在两个方面:
- 可串行性验证:若优先图中不存在环,则调度是冲突可串行化的。MVCC通过多版本减少了部分冲突,但仍需借助优先图判断实际运行时调度的正确性。
- 隔离级别特征分析:不同隔离级别对事务间的依赖类型有不同限制,优先图能直观展示这些限制——比如Snapshot Isolation(快照隔离)下的依赖结构就和可串行化级别有明显差异。
二、解析Snapshot Isolation下"无WW依赖"的结论
先明确几个关键概念:
- WW依赖:事务T1修改数据X后提交,事务T2随后也修改X并提交,此时存在T1→T2的WW依赖。
- 写集相交:两个事务的修改集合有重叠(即都修改了同一个数据项)。
Cockroach文档里的结论逻辑其实很清晰,核心是Snapshot Isolation的写冲突检测机制从根源上避免了并发成功提交事务的写集相交:
- 当事务T2准备提交时,会检查自己写集中的所有数据项,看是否在T2启动后被其他已提交事务修改过(这就是写冲突检测)。
- 如果发现冲突,T2会被直接中止重试,无法完成提交。
- 这意味着,任何两个成功提交的并发Snapshot事务,它们的写集一定没有交集——因为写集相交的话,其中一个必然会在提交阶段被中止,根本到不了提交完成的状态。
- 而WW依赖的前提是两个事务都修改了同一个数据项且都成功提交,既然Snapshot Isolation下这种情况不可能发生,自然不存在WW依赖。
至于rw依赖,Snapshot Isolation是允许的:比如事务T1读取了数据X的某个旧版本,之后事务T2修改X并提交,此时T1→T2的rw依赖是存在的——因为T1读的是T2修改前的状态,两者的操作存在逻辑上的先后依赖。
三、推荐的学习资料
书籍
- 《数据库系统概念》:第15章系统讲解了事务隔离级别、可串行化理论和冲突图,对MVCC和Snapshot Isolation的原理有清晰的推导。
- 《Transaction Processing: Concepts and Techniques》:事务处理领域的经典教材,深入覆盖优先图、隔离级别实现机制等核心内容,适合深挖底层原理。
文章
- 《A Critique of ANSI SQL Isolation Levels》:这篇论文首次明确了Snapshot Isolation的定义和边界,对比了它与严格可串行化的差异,是理解Snapshot Isolation的必读文献。
- CockroachDB官方《Transaction Isolation》文档:可以结合其中的MVCC实现细节反复研读,它能帮你把理论和实际工程落地联系起来。
内容的提问来源于stack exchange,提问作者GionJh
相关产品推荐
相关产品推荐

