数据库的原子性一致性

19
什么是原子性和一致性的区别?在我看来,两者用不同的词语表达相同的含义。
原子性
事务的所有任务要么全部完成,要么全部不完成。不存在部分事务。例如,如果事务开始更新100行数据,但系统在更新20行数据后发生故障,则数据库会将这20行数据的更改回滚。
一致性
事务将数据库从一个一致状态转移到另一个一致状态。例如,在将储蓄账户借记并将支票账户贷记的银行交易中,故障不能导致数据库仅向一个账户贷记,这将导致不一致的数据。
看起来原子性是一致性的一个子集,那么它应该是cid(一致性,隔离性,耐久性),没有原子性。

1
非原子、一致性:部分事务可能会使系统处于一致状态。原子、非一致性:系统的两个部分可能维持原子性而不一致(事务在其中一个部分记录,而在另一个部分没有记录)。 - nhahtdh
3个回答

20

原子性确保每个事务要么全部执行,要么全部不执行,意味着没有部分操作。

然而,一致性则是确保任何事务将数据库从一个有效状态转换到另一个有效状态。任何写入数据库的数据必须符合所有定义规则,包括但不限于约束、级联、触发器和它们的任何组合(参考维基百科)。这基本上意味着只有有效状态才会被写入数据库,如果一个事务不违反数据一致性,则将执行它; 如果违反数据一致性,则将回滚它。

希望以上内容能为您澄清问题。


看起来原子性是一致性的子集,那么应该是CID(一致性,隔离性,持久性),而不是原子性。 - Ram Sharan Mittal
刚刚在阅读高负载应用程序的书籍时,发现一句话:一致性不是关于数据库,而是关于应用程序业务逻辑 - 它取决于每次更新后业务数据的一致性。因此,在缩写中“C”是多余的 - 应该是“AID”。 - Dedyshka

6

简单解释一下“一致性”:如果数据库中的字段类型是整数,那么它只能接受整数值,而不能接受其他类型的值。如果你想在这个字段中存储其他类型的值,就会违反一致性。在这种情况下,事务将会回滚。


似乎这样的规则不仅适用于交易,而且适用于数据库一般。 - undefined

0

原子性
举个例子,假设有100条语句,其中可能包括插入语句等。如果在处理过程中任何一条语句失败,应该回滚剩余的语句,这意味着数据库应该返回到原始状态。

autocommit = false

try{
   statement one ;
   statement two ;
   statement three;
}
catch (){rollback;}
finally(){commit;}

一致性: 如果您尝试将数据插入需要满足约束、级联、触发器的数据库中,例如当您尝试将数据插入数据库时,但表具有主键约束,则您计划插入的数据应满足主键约束。

隔离性: 如果两个进程正在运行数据库,假设一个正在读取,另一个正在将数据写入数据库。 读取线程应仅读取已提交的数据,不应是内存数据。

持久性: 一旦事务数据提交到数据库中,应该保持相同的状态,不应受到电源故障或系统崩溃等影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接