事务一致性理解 事务ACID特性的完全解答

A  原子性

  事务管理者多个小操作,他们同时完成或者同时不完成就是原子性

 

C 一致性

  一致性,是一个很相对的,很主观的概念, 一致性 描述的是 事务 从一个一致的状态变成 另一个一致的状态。 一致性需要 AID 的 特性来保证,但是 还和我们的逻辑相关。

  一致性是数据库事务的特性,也就是说一个事务应该具有ACID。数据库事务保证AID。但是一致性使我们的代码逻辑和AID一起来保证的。

 

  比如: 张三 有100 块钱,李四 0 元。  这时候数据是一致的(这时候的数据状态是一致的,符合我们主观的约定)。

      操作:张三个李四转账 100 。

      事务提交以后。 张三:0 元。 李四:100 元,这时候我们认为数据是一致的,钱的总量没变,很主观的意识(  )

 

      思考: 如果转账要扣除手续费(扣除2 快手续费)。上面的结果就不是一致状态了。

        知识后我们认为具有一致性状态的的结果是.张三0元,李四98元。系统手续分收益加2元。所以一致性性是很主观的概念,又我们代码逻辑保证。

      

      思考2:如果 没有 AID  一致性是否可以成立

          没有A,张三减去100,李四没加钱。(一致性被破坏)(我们主观的认为钱总量是100,这里凭空少了了100)

          没有I ,张三 减去100 ,想给李四加 98 块钱。但是 独到了别人未提交的数据(读到另一个事务吧李四的钱改成100,然后这个事务还回滚了),

            给李四加98 ,这时候李四的钱变成 198 。系统手续费 加2 快。 结果诗句状态有不一致了(我们主观的认为钱总量是100,这里凭空多了100)。

         没有D。 正常操作完成 钱都 变成我们想要的记过。提交了,但是下一刻所有提交不见了。回复初始没提交的样子。虽然钱的总量还是一百,但是我们有转账这个操作,我们钱没按照我们设定的情景移动,

            如果只看 张三的数据,张三有转账成功记录。但是钱没变(我们的主观意识,张三的余额应该等于张三的初始余额加上转账记录。明显不相等,初始100,转账记录-100,余额应该是0 ,但是 现在余额是100 。不是数据不是我们认知的一致的状态)。

 

I 隔离性 (事务的不同隔离级别隔离性不同)

  两个方面

    1 事务 开启以后不会读到 别的事务的修改 ( 不可重复读 )

    2 事务不会读到别的事务没有提交的数据。(脏读)    

    3 事务 开启以后 不会读到别的事务的 插入,和删除 ( 幻读 )

D 持久性

  事务提交了,就写到硬盘。不会无故丢失。

 

 

 

我们可以简单的理解 事务 ACID 只有一个 一致性,AID  都是为了C,C(一致性是目的),只有 具有了 AID 才能有C。

 

比如 少了 A 有了部分完成(  redis 的 事务 就这样, redis 的那个事务 其实也不算不上事务,我认为叫做CAS 检查下的 批量操作 比较合适 ), 一致性不能得到保障

比如少了 I  读且了别人 没有提交的脏数据。 按照脏书做了修改。一致性被打破了。  比如  读了脏数据 导致中的钱多了,或者少了。

比如少了 D 没了持久  数据都丢了,还有 一致性吗? 

 

posted on 2019-07-06 01:23  zhangyukun  阅读(1209)  评论(0编辑  收藏  举报

导航