数据库特性之原子性和一致性
数据库的四大特性:原子性,一致性,隔离性和持久性。其中:
原子性:指事务包含的所有操作要么全部成功,要么全部失败回滚;
一致性:指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
我当时看见这两个特性就感觉很奇怪,难道原子性和一致性不是一样的吗?提交事务,原子性保证要么成功,要么失败,这样不就是很好的保证数据库的一致性了吗。当时我看见大多数人举的一致性例子就是转账问题:假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。当我我就想难道原子性不就保证了转账成功和失败吗?
其实,我上述想法是错的,但是部分错,因为,原子性确实代表一致性的部分,但不是全部。下面是我在知乎上看到的答案左轻候,感觉可以很好的解释原子性和一致性区别。
原子性其实并不能保证一致性的。再多个事务并行进行的情况下,即使保证每一个事务的原子性,任然可能导致数据不一致的结果。
举例:事务1需要将100元转入帐号A:先读取帐号A的值,然后在这个值上加上100。但是,在这两个操作之间,另一个事务2修改了帐号A的值,为它增加了100元。那么最后的结果应该是A增加了200元。但事实上,事务1最终完成后,帐号A只增加了100元,因为事务2的修改结果被事务1覆盖掉了。
如上,保证了原子性,但是数据库的一致性没有得到保证,上述这种情况就需要数据库隔离性的保证了。
有需要,请查看原文:
https://www.zhihu.com/question/30272728/answer/132403859