知识卡片
ACID原子性的本质是可中止性与并发无关
内容
ACID的原子性容易被和多线程编程里的”原子操作”(其他线程看不到操作的一半结果) 混淆,但两者含义不同——多线程的原子性关乎并发,而ACID的原子性完全不涉及并发, 它描述的是:客户端想做多次写入,但写到一半时出了故障(进程崩溃、网络中断、磁盘 写满、违反完整性约束)该怎么办。如果这些写入被分组进一个原子事务,一旦事务因错误 无法完成,整个事务就被中止,数据库必须丢弃或撤销这个事务目前为止做过的所有写入 ——而不是留下”写了一半”的痕迹。没有原子性时,写到一半出错会让应用完全不知道哪些 改动已经生效,重试又可能造成重复写入、产生错误数据;有了原子性,事务一旦中止, 应用可以确信”什么都没改变”,因此能安全地重试。原文把原子性的定义特征直接归纳为 “能够在错误时中止事务,丢弃该事务进行的所有写入变更的能力”,并指出用”可中止性” 这个词或许比”原子性”更准确、只是”原子性”是惯用叫法罢了——理解这一点,是理解为什么 ACID的”A”和”I”(隔离性)是两个完全独立的正交问题的关键:一个管”故障时怎么办”, 一个管”并发时怎么办”,不能混为一谈。
参考来源
- 位置:《数据密集型应用系统设计》第七章《事务》"原子性"(源文件:
_epub-src/ch7_split_000.html)
- 结论依据:原文明确区分ACID原子性与多线程原子操作的不同,说明ACID原子性描述
的是写入过程中出错时事务能否被中止并丢弃已做的写入,并指出"可中止性"或许是
更准确的术语,直接支撑本卡片结论。
- 原始内容:相比之下,ACID的原子性并不是关于并发的……ACID的原子性描述了当客户
想进行多次写入,但在一些写操作处理完之后出现故障的情况……ACID原子性的定义
特征是:能够在错误时中止事务,丢弃该事务进行的所有写入变更的能力。