在ACID中,C是DBMS实施的责任吗?

时间:2014-03-03 22:01:40

标签: database transactions rdbms consistency acid

我对ACID的概念感到困惑 所有参考/教科书都将ACID描述为数据库系统预期/需要维护的一组属性,以保持数据的完整性。
但是ACID的C部分即一致性实际上似乎并不是数据库的责任 在某些参考文献(例如Silberschatz)中,事务的代码本身(如果单独运行)使数据库处于一致状态,即事务代码是正确的,因此这是应用程序的程序员不是DBMS的观点。 /> 而在其他参考文献中,描述含糊不清,如“使数据库处于一致状态” 哪个是正确的?

1 个答案:

答案 0 :(得分:4)

在交易中,技术术语一致意味着“满足所有已知的完整性约束”。

根据定义,完整性约束被声明为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。 (CHECK约束已解析但未强制执行,使用GROUP BY不确定结果,没有分析函数,反引号中的非标准引用等)


如果我面前有数据库系统概念,我想了解作者的意思“确保单个事务的一致性是编写事务的程序员的责任。” ,我会问自己这些问题。

  • 是否有任何勘误引用相关部分?
  • 作者在早期版本中对ACID属性的评价是什么?在以后的版本中?
  • 作者是否从一致事务中区分正确的事务(它们具有正确的数据)(它们不违反任何完整性约束)?
  • 作者总是是否认为一致性是程序员的责任? (我说的是正确性;一致性不是。)
  • 作者在谈论什么程序员? (应用程序员编写Rails应用程序?DBA编写存储过程?硬核程序员编写PostgreSQL的事务子系统?)
  • 作者从不说一致性是dbms的责任吗?
  • 作者是否说过,在事务的四个ACID属性中,A,I和D是dbms的责任,但C不是? (我敢打赌他没有。)
  • 单个事务的一致性是否与数据库的一致性不同?作者还在哪里谈论这个问题?

  1. “集中控制数据库有助于避免此类问题 - 只要可以避免 - 允许数据管理员定义,DBA实施完整性约束(也无论何时执行任何更新操作,都要检查业务规则。“ 数据库系统简介,第7版,C.J。日期,第18页。