Database 一个数据库能支持吗;原子性“;但不是",;一致性“;反之亦然?
我正在阅读数据库的ACID属性。原子性和一致性似乎密切相关。我想知道是否有任何情况下,我们只需要支持原子性而不支持一致性,反之亦然。举个例子真的很有帮助 它们有些关联,但有细微的区别 原子性意味着事务发生或不发生 一致性意味着像引用完整性这样的事情被强制执行 假设您启动一个事务以添加两行(形成单个银行事务的贷方和借方)。它的原子性与数据库的一致性无关。这意味着要么两行,要么两行都不添加 在一致性方面,假设您有一个从Database 一个数据库能支持吗;原子性“;但不是",;一致性“;反之亦然?,database,database-design,consistency,atomicity,Database,Database Design,Consistency,Atomicity,我正在阅读数据库的ACID属性。原子性和一致性似乎密切相关。我想知道是否有任何情况下,我们只需要支持原子性而不支持一致性,反之亦然。举个例子真的很有帮助 它们有些关联,但有细微的区别 原子性意味着事务发生或不发生 一致性意味着像引用完整性这样的事情被强制执行 假设您启动一个事务以添加两行(形成单个银行事务的贷方和借方)。它的原子性与数据库的一致性无关。这意味着要么两行,要么两行都不添加 在一致性方面,假设您有一个从订单到产品的外键约束。如果您试图添加一个引用不存在的产品的订单,那么一致性就会起作
订单
到产品
的外键约束。如果您试图添加一个引用不存在的产品的订单,那么一致性就会起作用,阻止您这样做
两者都是关于将数据库保持在可操作状态,因此它们是相似的。前一个示例将确保银行不会赔钱(或从您那里偷钱),后一个示例将确保您的应用程序不会对您一无所知的产品订单感到惊讶。原子性:
在原子事务中,一系列
数据库操作要么全部发生,
或者什么也没有发生。保证
原子性阻止对
数据库仅部分发生,
这可能会造成比以前更大的问题
完全拒绝整个系列
一致性:
在数据库系统中,一致的
交易是一个不存在的交易
违反任何完整性约束
在执行期间。如果是交易
使数据库处于非法状态
状态,则会中止,并显示错误
报告
如果事务成功完成,支持原子性但不支持一致性的数据库将允许使数据库处于不一致状态(即违反引用或其他完整性检查)的事务。例如,如果执行此操作的事务成功完成,则可以向int列添加字符串
相反,支持一致性但不支持原子性的数据库将允许完成部分事务,只要该事务的效果没有破坏任何完整性检查(例如,外键必须与现有标识匹配)。
例如,您可以尝试添加一个包含字符串和int值的新行,即使插入在丢失一半数据的中途失败,只要丢失的数据都不是必需的列,并且没有数据插入到错误类型的列中,该行也是允许的
话虽如此,一致性依赖于原子性来逆转不一致的事务。我对ACID上下文中的一致性有不同的理解: 在事务中,如果在同一事务中检索到给定的数据项并在以后再次检索,则不会看到任何更改。也就是说,在整个事务中,为事务提供了数据库的一致状态。唯一可以更改事务可见数据的更新是由事务本身完成的更新
在我看来,这相当于可序列化性。在阅读有关原子性和一致性的文章时,我也感到困惑。假设在account表中批量插入1000条记录 如果插入了所有1000条记录,则批处理的原子性为,如果出现错误,则不插入任何记录 如果在帐户记录级别,我们设置了使插入成功的逻辑,即使数据类型不匹配,相关记录插入到外键表中,并在成功更新帐户记录后删除,则批的一致性将被违反
希望这个例子能消除混淆 原子性和一致性之间确实存在着很强的关系,但它们并不相同:
然而,我相信(但尚未正式证明)如果您的DMB同时保证原子性和隔离性,那么它还必须保证一致性 更正:事务在完成后不能使数据库处于违反约束的状态。但是,在某些情况下,事务会暂时违反约束,但会在完成之前解决冲突。谢谢Graphain和Walter@WalterMitty:一个支持原子性和一致性的数据库可以允许一个原子事务,如果单独完成,它的组成部分将使数据库处于不一致的状态。我不认为一个至少不支持一些原子事务的数据库会允许“暂时的不一致”。此外,虽然延迟强制约束直到“提交”的能力肯定是有用的,但我不知道特定数据库支持原子性和一致性这一事实暗示了这种能力;我认为Jet数据库