我正在阅读有关数据库的酸性特性。原子和一致性似乎密切相关。我想知道是否有任何场景我们需要支持原子性,而不是一致性或反之亦然。一个例子真的会有所帮助!

有帮助吗?

解决方案

他们 有些相关,但有微妙的差异。

原子性意味着您的交易要么发生或没有发生。

一致性意味着诸如参考完整性之类的事情得到了执行。

假设您开始进行交易以添加两行(构成单个银行交易的信用和借记)。它的原子性与数据库的一致性无关。这意味着将添加行或两行。

在一致性方面,假设您有一个外键约束 ordersproducts. 。如果您尝试添加指指不存在的产品的订单, 那是 当一致性开始以防止您这样做。

两者都旨在将数据库保持在可行状态,从而相似。前一个示例将确保银行不会亏本(或从您那里窃取钱),后者将确保您的申请不会对您一无所知的产品的订单感到惊讶。

其他提示

原子性:

在原子交易中,一系列数据库操作要么发生,要么没有发生任何事情。原子能的保证可以阻止仅部分发生数据库的更新,这比直接拒绝整个系列可能会引起更多的问题。

一致性:

在数据库系统中,一致的交易是在执行过程中不会违反任何完整性约束的交易。如果交易将数据库留在非法状态,则该数据库将中止并报告错误

支持原子能但不一致性的数据库将允许将数据库以不一致的状态(即违反参考或其他完整性检查)保持交易,前提是事务成功完成。例如,只要成功完成此完成的交易,您就可以将字符串添加到INT列中。

相反,只要该交易的效果没有打破任何完整性检查(例如外国密钥必须与现有身份匹配),支持一致性但不支持原子能的数据库将允许部分交易完成。例如,您可以尝试添加一个包括字符串和int值的新行,即使插入失败了一半的数据,只要丢失的数据都不是丢失的数据被插入错误的列中。

话虽如此,一致性依赖于原子性来逆转不一致的交易。

我对酸环境中的一致性有不同的了解:

在交易中,如果在同一交易中再次检索给定的数据项目并再次检索,则不会看到更改。也就是说,在整个交易中,交易给予数据库的一致状态。可以更改交易可见数据的唯一更新是交易本身完成的更新。

在我看来,这与序列化性有关。

在阅读有关原子和一致性时,我也感到困惑。假设帐户表中有1000个记录的批处理插入情况。

原子 批处理是插入所有1000个记录,或者如果有错误,则没有插入任何记录。

一致性 如果在帐户记录级别上,我们已经将逻辑成功地侵犯了批次,即使数据类型不匹配,也将插入成功,相关记录已插入外国钥匙表,然后在成功的帐户记录更新后删除。

希望这个示例清除了混乱。

原子性和一致性之间确实存在很强的关系,但它们并不相同:

  1. DBMS可以(理论上)支持一致性,而不是原子能:例如,考虑由SQL操作O1,O2和O3组成的交易。现在,假设在O1和O2之后,DB已经处于一致的状态。然后,DBM可以在没有O3的情况下停止在O1和O2之后停止交易,并且仍然可以保留一致性。显然,这样的DBMS确实可以支持原子能(因为O3不是由O1和O2执行的)。

  2. DBM可以(理论上)支持原子性而不是一致性:这可以在多用户场景中发生,在多用户场景中,原子性仅确保将执行交易的所有操作(或者没有),但不能保证一个人的动作与另一笔交易同时进行的交易可能不会处于不一致的状态。

但是,我确实相信(但尚未正式证明)是,如果您的DMB可以保证原子能和孤立性,那么它也必须保证一致性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top