知识卡片
ACID一致性其实是应用的属性而非数据库能保证的属性
内容
“一致性”是个被过度重载的词——副本一致性(异步复制里的最终一致性)、一致性哈希、 CAP定理里的一致性(指线性一致性)、ACID里的一致性,四种含义各不相同。ACID意义上 的一致性指的是:对数据的一组特定约束(不变量)必须始终成立,比如会计系统里所有 账户整体上必须借贷相抵——如果一个事务从满足不变量的状态开始,事务处理期间的写入 始终保持这个不变量,那么不变量就一直成立。但这个不变量是谁定义、谁负责维护的? 答案是应用程序,而不是数据库——数据库只是被动地存储你写入的数据,如果你写入了 违反不变量的脏数据,数据库本身并不能阻止你(除非是外键约束、唯一约束这类数据库 能识别的特定类型不变量,但一般性的业务不变量数据库根本不理解)。这意味着原子性、 隔离性、持久性都是数据库自身能提供的保证,而一致性从根本上是应用的责任:应用可以 依赖数据库的原子性和隔离性来更容易地维持一致性(比如靠原子性保证”要么全改要么都不 改”,靠隔离性保证不会看到中间状态),但一致性本身不是数据库单方面能兜底的。这解释 了为什么有观点认为ACID里的字母C其实不该算数——它更像是当年凑缩写的产物,而非 数据库真正能独立提供的技术保证。
参考来源
- 位置:《数据密集型应用系统设计》第七章《事务》"一致性"(源文件:
_epub-src/ch7_split_000.html)
- 结论依据:原文说明ACID一致性指数据不变量始终成立,但这取决于应用对不变量的
理解和正确定义、数据库无法阻止写入违反不变量的脏数据,并指出原子性隔离性
持久性是数据库属性而一致性是应用属性,因此"C不属于ACID",直接支撑本卡片结论。
- 原始内容:ACID一致性的概念是,对数据的一组特定约束必须始终成立……但是,一致性
的这种概念取决于应用程序对不变量的理解,应用程序负责正确定义它的事务,并保持
一致性……原子性,隔离性和持久性是数据库的属性,而一致性(在ACID意义上)是
应用程序的属性……因此,字母C不属于ACID。