我对酸的概念感到困惑。
所有参考资料/教科书都将 ACID 描述为数据库系统期望/需要维护以保持数据完整性的一组属性。
但是 ACID 的 C 部分,即 Consistency 似乎实际上并不是数据库的责任。
在某些参考文献(例如 Silberschatz)中,事务的代码本身(如果单独运行)使数据库处于一致状态,即事务代码是正确的,因此这是应用程序程序员的观点,而不是 DBMS。
在其他参考资料中,描述很模糊,例如“使数据库保持一致状态”
那么哪个是正确的?
1 回答
在交易中,技术术语一致意味着“满足所有已知的完整性约束”。
根据定义,完整性约束被声明给 dbms,并期望由 dbms 强制执行。为什么?因为如果应用程序程序员负责,每个应用程序程序员可能会就什么构成一致的更新操作做出不同的决定。
例如,一位应用程序程序员可能认为每一个超过 10,000 美元的单价都是错误的。另一个应用程序程序员可能会认为每个超过 12,000 美元的单价都是错误的,但 11,000 美元是有效的单价。一名程序员的工作将接受11,000美元的单价;其他人会将其作为错误踢出。
关系数据库通过集中有关单价的决策来解决这种不一致。在这种特殊情况下,该决定可能以“unit_price”列上的 CHECK() 约束的形式集中。一旦完整性约束到位,每次更新操作都会在“unit_price”列中产生一致的值。没关系
- 有多少应用程序程序员,
- 他们训练有多么好(或多么糟糕),
- 有多少不同的应用程序,
- 他们是用什么语言写的,
- 睡眠不足的 DBA 是否正在从命令行控制台执行更新。
所有这些更新操作都会发现无法将“unit_price”列设置为无法满足所有已知完整性约束的值。这意味着所有这些更新操作将导致满足所有已知完整性约束的状态。这就是一致的定义。
在关系模型中,完整性约束和业务规则的含义相同。1有些人使用业务规则来表示别的意思;您必须通过仔细阅读来确定它们的含义。
如果您的数据很重要,则完整性约束(或业务规则)永远不应受最终用户的控制。DBA 可以轻松更改约束,通常使用单个 SQL 语句。但是知道执行哪个语句以及何时执行它并不是大多数最终用户的技能。
术语一致和正确意味着两个不同的东西。数据库状态可以是一致的,但并不正确。在 CHECK() 约束范围内的单价可能仍然是错误的价格,一个人的名字可能拼写错误,等等。
关系模型和 SQL 标准都不是由特定的 SQL 实现定义的。它们尤其不是由 MySQL 的行为定义的,这只是 SQL。(检查约束已解析但未强制执行,使用 GROUP BY 的不确定结果,无分析函数,反引号中的非标准引用等)
如果我面前有数据库系统概念,并且我想了解作者所说的“确保单个事务的一致性是编写事务的程序员的责任”的意思,我会问自己这些问题。
- 是否有任何涉及相关部分的勘误表?
- 作者在早期版本中对 ACID 属性有什么看法?在以后的版本中?
- 作者是否区分正确的交易(他们有正确的数据)和一致的交易(他们不违反任何完整性约束)?
- 作者总是说一致性是程序员的责任吗?(我会说正确性是;一致性不是。)
- 作者在说什么程序员?(应用程序程序员编写 Rails 应用程序?DBA 编写存储过程?核心程序员编写 PostgreSQL 事务子系统?)
- 作者从来没有说过一致性是 dbms 的责任吗?
- 作者有没有说过,在事务的四个 ACID 属性中,A、I 和 D 是 dbms 的责任,而 C 不是?(我敢打赌他不会。)
- 单个事务的一致性与数据库的一致性不同吗?作者在哪里还谈到了这一点?
- “数据库的集中控制可以帮助避免此类问题——在可以避免的范围内——通过允许数据管理员定义并由 DBA 实施,以便在任何时候检查完整性约束(也称为业务规则)执行更新操作。” 数据库系统简介,第 7 版,CJ Date,第 18 页。