代码改变世界

如何理解事务的四大特性

2020-04-27 10:26  Tony、  阅读(722)  评论(0编辑  收藏  举报

概要

数据库事务四大特性 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)简称ACID

定义

原子性:事务是一个不可分割的单位,事务中的所有操作要么都成功,要么都失败
一致性:所谓一致性,指的是数据处于一种有意义的状态,这种状态是语义上的而不是语法上的。即从实际的业务逻辑上来说最终结果是对的,是跟实际所期望的结果完全符合的。
隔离性:事物与事物之间是相互隔离的,不同隔离级别描述了事务被隔离的程度。
持久性:是指事务一旦提交后,数据改变是永久性的,不可变的。

一致性是基础,也是最终目的,其他三个特性(原子性、隔离性和持久性)都是为了保证一致性的。

解析

1 原子性并不能完全保证一致性。

  在多个事务并行进行的情况下,即使保证了每一个事务的原子性,仍然可能导致数据不一致的结果。  

  例如,事务1需要将100元转入帐号A:先读取帐号A的值,然后在这个值上加上100。但是,在这两个操作之间,另一个事务2修改了帐号A的值,为它增加了100元。那么最后的结果应该是A增加了200元。但事实上,務1最终完成后,帐号A只增加了100元,因为事务2的修改结果被事务1覆盖掉了。此时不管是事务 1 还是事务 2,它们都各自保证了原子性,但是并没有做到一致性,因为A 应该增加了 200 元,而实际只增加了100 元

2 即是事物有了原子性 隔离性 持久性并不能完全保证一致性  

  要根据具体的业务来选择不同的隔离级别 才能保证事物的一致性。

  例如,事务1的隔离级别是未提交读,需要将100元转入帐号A:先读取帐号A的值,然后在这个值上加上100。但是,另一个事务2在事物1读取之前修改了帐号A的值为200,但是还没有提交,而此时事物1读取的值就是200,但是之后事物2回滚了,而事物1又给A的值加了100,最终A的值是300,此时就会导致账号A的值多了100,最终导致数据不一致。此时如果事务1用的是提交读的隔离级别就可以保证一致性。