原子性和一致性到底有什么区别什么关系?
今天和同事讨论一个系统设计问题,讨论到分布式事务时候,突然想到事务的几个特性,然后说着说着,怎么感觉原子性和一致性是一回事啊?后来自己慢慢思考了一下,浅谈个人理解,MARK此处一下:
-
原子性:这个侧重点是事务执行的完整,一套事务下来,如果有一个失败,那整体失败。也就是要么大家一起成功,要么全都回滚。
-
一致性:这个侧重点是业务逻辑和规则,一致性的核心一部分是靠原子性实现的,而另一部分是逻辑实现。
简单点说:原子性不存在,那一致性基本不能保障,至少强一致性不行,也许可以通过业务逻辑的修改达到最终一致性。
另外来个常见的例子:转账:张三给李四转账100元。那数据库假设需要张三扣100,李四加100,记录一条流水。
如果流水没记录成功,那整体回滚,张三也没转账成功,李四也没多钱。这就是原子性的体现。
而张三必须扣100,李四必须加100,这个就是一致性了,如果因为某些逻辑原因,导致张三扣了100,流水记录100转账,而李四只加了60。然后这3条操作都成功了,那原子性就符合了,但是一致性就不符合了。
其实在实际应用中肯定不是这么简单的例子的。往往是类似,买东西扣库存这类的逻辑,主表里有库存,库存表里有库存,然后就因为设计缺陷,就算加了事务还是出现了主表库存对不上库存表库存的问题,这个就是一致性不满足的了。