CAP 理论
Isolation 隔离性
Dirty Write 脏写
一个事务可以覆盖另一个事务还未提交的已修改的值。
案例:
事务 A: x = 1; y = 1;
事务 B: x = 2; y = 2;
期望的结果:x,y
全为 1
或 2
。
t1: x = 1;
t2: x = 2;
t3: y =2 ;
t4: y = 1;
实际结果:x = 2; y = 1;
与预期不符。
Dirty Read 脏读
一个事务读取到了另一个事务未提交的已修改的数据。
案例
事务A: x,y 都有 50 元,现在 x 给 y 转账 40 元。 x = x - 40; y = y + 40;
事务B: 读取 x,y 的值。
t1:
x = 50, y = 50
t2:x = 10, y = 50
注意: 此时 x 已扣减,但是 y 没有增加,这个是因为事务还没执行结束
t3: 事务 Bx = 10; y= 50;
发现x + y = 60 < 100
此处发生了脏读
t4:x = 10, y = 90
事务 A 执行结束
t5: 事务Bx = 10; y = 90;
Non-Repeatable Read 不可重复读
同一个事务,2 次读取的值不一样。
案例同上,在 t2
、t5
时刻,事务B
读取到的 y
值是不同的(t2: y = 50; t5: y = 90;)。
Phantom 幻读
Phantom
通常发生在一个事务首先进行了一次按照某个条件的read
操作,譬如SQL
里面的SELECT WHERE P
, 然后在这个事务还没结束的时候,另外的事务写入了一个新的满足这个条件的数据,这时候这个新写入的数据就是Phantom
的了。
案例
数据库表 user 有三条数据
t1: 事务 A 查询 user 表的总数,结果为3
t2: 事务 B 新增了一条数据。
t3: 事务 A 再一次查询了 user 表的总数,结果为 4 ,与 t1 时刻查询结果不一致。
Lost Update 丢失的更新
- 一个事务撤销时,把另一个已提交事务的更新数据覆盖了。
- 一个事务覆盖另一个事务已提交的数据。
Cursor Lost Update
Read Skew
Read Skew 发生在两个或者多个有完整性约束的数据上面
Write Skew
Consistency 一致性
相关文档
https://www.jianshu.com/p/3673e612cce2
https://jepsen.io/consistency/models