知识卡片

ACID一致性不等于正确性,及"事务不是完整性单位"

普通读书笔记卡

内容

ACID的一致性(consistency)指的是任何事务把数据库从一个一致状态转换到另一个 一致状态,中间时刻不必保持一致;这里的”一致”其实只是”完整性”的另一种说法 ——数据库状态一致当且仅当它满足所有已定义的约束。业界长期存在一种流行观点: 事务应该是”完整性的单位”,也就是默认接受”约束只需要在事务提交时满足即可, 事务内部过程中可以暂时违反”这一立场。书中明确不认同这个说法,主张完整性的 单位应该是语句(statement)——数据库约束必须在每条语句执行完成的边界处就 得到满足,而不能靠事务边界拖延到最后。理解这条主张的关键是看清一致性和正确性 (真实性)本质上是两个不同层级的概念:一个数据库若只包含真命题,它必然是一致 的,但反过来一个”一致”(不违反任何已声明约束)的数据库未必真的反映了现实 世界的真相——”正确”能推出”一致”,但”一致”推不出”正确”;同理”不一致”能推出 “错误”(数据库里至少存在一个假命题),但”错误”推不出”不一致”(可能存在一个 假命题恰好不违反任何声明的约束)。这个区分之所以重要,是因为它划清了系统能力 的边界:DBMS永远无法验证一条断言在现实世界中是否真实(供应商S1是否真的 “位于”London这件事本身超出了系统的判断能力),系统唯一能做、也应该做到的 就是强制一致性——检验用户的断言有没有违反已声明的约束,一旦通过就假定它为真, 直到未来某次更新明确推翻它为止。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第8章"SQL与约束" 8.5节"事务"(源文件:OEBPS/text00093.html) - 结论依据:原文明确"一致性指的是任何事务都是将数据库由一个一致性状态转换 为另外一个一致性状态……当且仅当数据库状态满足所有已经定义的约束时,数据库 的状态是一致的(此处的一致性只是完整性的代名词而已)……对于事务的一个长盛 不衰的说法是,事务应该作为'完整性的单位'……但是我并不认同此说法。我相信 完整性的单位更应该是语句"。 - 原始内容:当且仅当数据库状态满足所有已经定义的约束时,数据库的状态是一致 的(此处的一致性只是完整性的代名词而已)……我相信完整性的单位更应该是 语句……我相信数据库约束必须在语句边界处得到满足。