我对ACID的概念感到困惑
所有参考/教科书都将ACID描述为数据库系统预期/需要维护的一组属性,以保持数据的完整性。
但是ACID的C部分即一致性实际上似乎并不是数据库的责任
在某些参考文献(例如Silberschatz)中,事务的代码本身(如果单独运行)使数据库处于一致状态,即事务代码是正确的,因此这是应用程序的程序员不是DBMS的观点。 />
而在其他参考文献中,描述含糊不清,如“使数据库处于一致状态”
哪个是正确的?
答案 0 :(得分:4)
在交易中,技术术语一致意味着“满足所有已知的完整性约束”。
根据定义,完整性约束被声明为dbms,并且预计由dbms强制执行。为什么?因为如果应用程序员负责,每个应用程序程序员可能会做出关于什么构成一致更新操作的不同决定。
例如,一位应用程序员可能会决定每个超过10,000美元的单位价格是错误的。另一个应用程序员可能会认为超过12,000美元的每个单价都是错误的 - 但是11,000美元是有效的单价。一位程序员的工作将接受11,000美元的单价;对方将把它作为一个错误发出。
关系数据库通过集中关于单位价格的决策来解决这种不一致性。在这种特殊情况下,该决定可能以“unit_price”列上的CHECK()约束的形式集中。一旦完整性约束到位,每次更新操作都将在“unit_price”列中产生一致的值。没关系
所有这些更新操作都会发现无法将“unit_price”列设置为无法满足所有已知完整性约束的值。这意味着所有这些更新操作都将导致满足所有已知完整性约束的状态。这就是一致的定义。
在关系模型中,完整性约束和业务规则意味着相同的事情。 1 有些人使用业务规则意味着别的东西;你必须仔细阅读才能确定它们的含义。
如果您的数据很重要,完整性约束(或业务规则)应该从不在最终用户的控制之下。 DBA可以轻松更改约束,通常使用单个SQL语句。但是知道要执行哪个语句而执行它时并不是大多数最终用户的技能组合。
术语一致和正确意味着两件事。数据库状态可以保持一致而不正确。在CHECK()约束范围内的单位价格可能仍然是错误的价格,某个人的姓名可能拼写错误等。
关系模型和SQL标准都不是由特定的SQL实现定义的。它们尤其不是由MySQL的行为定义的,这只是几乎没有SQL。 (CHECK约束已解析但未强制执行,使用GROUP BY不确定结果,没有分析函数,反引号中的非标准引用等)
如果我面前有数据库系统概念,我想了解作者的意思“确保单个事务的一致性是编写事务的程序员的责任。” ,我会问自己这些问题。