事务ACID —— 一致性

什么是一致性 ?

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的默认规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
引用自维基百科 —— ACID

上一篇文章中事务ACID —— 原子性,原子性的特性是要么成功,要么失败,不存在中间状态。

那么一致性的核心是什么?

一致性的核心就是一个词happen-before。简单的说,就是can

假设 事务A事务B的关系是前后关系,那么这就没有任何问题。
但是所有事务单元不可能是完美意义上的先后关系,它一定会存在不同意义上的并发。
当2个事务单元并发时怎么办?

继续拿上一边文章中的A 和 B转账案例来说,

假设 事务A 是上边这个操作,当事务A执行到ver2时,A 和 B 都是 0 元, 此时 事务B 为 C 给 B 转账了300元,那么 B 就应该有300 元了。就在这个时候 事务A执行失败,事务为了保持原子性,操作回滚,那么B的钱就滚回了0元,也就是B资损了300元。那么也就出现了金钱不一致的情况。

那么最简单的方法就是加锁,让事务B不影响事务A的执行结果。如下:

有了这个锁以后,事务B就会形成要么在事务A之前执行,要么在其之后执行。这就是一致性给到的保障。这样做以后我们就会发现,这个其实就是把所有的请求做了一个排队的处理。但是它有一个致命的缺点就是它的并发是起不来的,那么性能也就是极差的。

由此我们可以总结,一致性就是一个事务单元只有在全部成功后,才可以对外可见。拿转账业务来说就是要么A有100元,要么B有100元。当ver2时,A和B都为0元是对外不可见的,外部是访问不到的。