数据库原子性一致性

时间:2012-09-30 20:25:43

标签: database acid

原子性和一致性有什么区别?在我看来,两个人都用不同的词语说同样的话。

原子性

执行事务的所有任务或不执行任何事务。没有部分交易。例如,如果事务开始更新100行,但系统在20次更新后失败,则数据库将更改回滚到这20行。

一致性

事务将数据库从一个一致状态转到另一个一致状态。例如,在银行交易中扣除储蓄账户并贷记支票账户时,故障不得导致数据库仅贷记一个账户,这会导致数据不一致。

3 个答案:

答案 0 :(得分:15)

Atomicity确实说每个事务都是全部或全部,意味着它的全部或全部动作都没有执行,也没有部分操作。

但是,一致性讨论了确保任何事务将数据库从一个有效状态转移到另一个有效状态。写入数据库的任何数据必须根据所有定义的规则有效,包括但不限于约束,级联,触发器及其任何组合 (taken from Wikipedia)。 这基本上意味着只有有效状态被写入数据库,并且如果事务不违反数据一致性就会被执行,如果事务没有,则会被回滚。

希望它能为你解决问题。

答案 1 :(得分:2)

简单解释对于一致性:如果数据库中的字段类型是Integer,它应该只接受Integer值,而不是某种其他类型。如果要在此字段中存储其他类型,一致性被侵犯了。在这种情况下,事务将回滚。

答案 2 :(得分:0)

原子性
        一堆语句只是举一个100语句的例子,也可以是insert语句,如果任何语句失败,处理时应该还原剩余语句,这意味着数据库应该返回原始状态。

  

块引用

autocommit = false

try{
   statement one ;
   statement two ;
    `enter code here`
    `enter code here`
    `enter code here`
   statement three;
  }
   catch (){rollback;}
  finally(){commit;} t

一致性:                         如果您尝试将日期插入到数据库中,需要满足约束,级联,触发器,例如在您尝试将数据插入数据库时​​,但该表具有主键约束,因此您计划插入的数据应满足主键约束。

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

耐用性:                    一旦提交到数据库的事务数据应该是同一阶段,它不应该影响从电源故障或系统崩溃任何其他