对事务一致性的理解

作者:人生初见
链接:https://www.zhihu.com/question/31346392/answer/61742840
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

要想真正弄清楚这个问题,那是必须要把数据库理论中的事务机制从头开始看起,牵扯的内容比较多。
当然,如果只是想粗略的了解下,我就来举个例子吧——当然不可能太严谨。
假设我们10个人,每人有一个账号,里面有钱,可以转来转去,这组成了一个小型的数据系统,那么什么叫数据一致性?这是由你自己来定义的,比较通用的就是:这10个人的账号金额总数不变——满足这一条件,就叫数据一致,不满足,就叫数据不一致,或者在分布式的环境下,有一个数据在几个地方都保存了,那么任何时候,这几个地方的数据都必须相同,这也叫一致性。
现在我们就这个简单的一致性规则:10个人的账号金额总数不变。假设初始的时候每个人账号里有一万,A账号往B账号里转5000,这时候数据库要执行两行代码:
A:减去5000
B:加上5000
在执行完第一行代码的时候,这时候数据是不满足一致性条件的!必须要执行完第二行代码,数据才恢复到一致性的状态!换而言之,数据库中的数据是经常处于不一致的状态,这是不可避免的,因此我们提出了事务的概念,用于检测数据库中的数据是否处于一致性状态——如果数据库中有没有执行完的事务,那就是不一致的,否则,就是一致的。
上面的例子只是最简单的情况,实际的运用中要复杂得多,比如前面提到的分布式系统:某个数据存在了三个服务器上,现在要更新,就必须保证三个服务器上全都更新好,如果有一个没有成功,那么其他两个也应该维持不变,这又涉及到网络通信等问题,非常的折腾。
——————————————————————————————————————
评论中有提到了原子性,其实原子性与一致性是两个完全不同的概念,当然他们的联系也很紧密。
还是用上面的这个例子:
为了保证一致性(即10个人 的账号金额总数不变),那在我写代码的时候,如果写了代码:
A=A-5000;
那就必须要写上
B=B+5000,或者是C=C+5000,这样的代码才能保证了数据库的一致性状态。
那什么是原子性?
就是将上面的两行代码合成为一个事务,要么全做,要么全不做。
比如我写了两行代码:
A=A+2000;
B=B+3000;
如果这两行代码看成是一个事务,并且在某一时刻全执行完了,那么这个事务的原子性满足了,但却没有满足数据库的一致性。
  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值