前面我们已经分析了因为原子性并不能保证事务在一个时间点上完成,而是在一个时间片上完成,所以不能作为一致性的充分条件.详细的分析,可以参考:http://flyfoxs.iteye.com/admin/blogs/2087543
那么原子性,加上隔离性可以推导出一致性吗? 下面我们通过一个例子来分析下这个问题.
场景如下
A是老板,需要给员工B, C发工资. A账户里面有100元,需要给2员工,每人20元工资.
如果只有隔离性,和原子性那么操作结果如下.
时间戳 | 事务1 | 事务2 |
t1 | A减少20 | |
t2 | B添加20 | A减少20 |
t3 | 提交(A=80, B=20) | C添加20 |
t4 | 提交(A=80, C=20) |
因为隔离性,T2时间点,虽然A已经减少了20元,但是并没有提交,所以事务2读到的A依然拥有100元(如果读取的是80,那就问题大了,属于读取脏数据).
在这里如果没有特别的处理,就会导致事务2提交后在T4时间点A有80元, B 和 C各有20元,总额120元,很明显数据不一致了,T1时间点,总额只有100元.
通过上面这个例子也就可以很容易的发现了,原子性和隔离性不能保证一致性.
很显然那上面这个场景是很普通,数据库是如何来保证最终一致性的呢,我会在下一篇里面继续讨论这个.