zoukankan      html  css  js  c++  java
  • 数据库特性之原子性和一致性

    数据库的四大特性:原子性,一致性,隔离性和持久性。其中:
    原子性:指事务包含的所有操作要么全部成功,要么全部失败回滚;
    一致性:指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
    我当时看见这两个特性就感觉很奇怪,难道原子性和一致性不是一样的吗?提交事务,原子性保证要么成功,要么失败,这样不就是很好的保证数据库的一致性了吗。当时我看见大多数人举的一致性例子就是转账问题:假设用户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

  • 相关阅读:
    Java之装饰模式
    Sharding-jdbc(一)分库分表理解
    JVM(四)JVM的双亲委派模型
    JVM(三)JVM的ClassLoader类加载器
    JVM(二)JVM的结构
    JVM(一)JVM的概述与运行流程
    Redis随笔(六)RESP的协议规范
    Redis随笔(五)Jedis、jedisCluster的使用
    Collections.synchronizedList使用方法陷阱(1)
    Collections.synchronizedList使用方法
  • 原文地址:https://www.cnblogs.com/loren-Yang/p/7466132.html
Copyright © 2011-2022 走看看