跳到主要内容

CAP 理论

Isolation 隔离性

Dirty Write 脏写

一个事务可以覆盖另一个事务还未提交的已修改的值。

案例:

事务 A: x = 1; y = 1;

事务 B: x = 2; y = 2;

期望的结果:x,y 全为 12

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: 事务 B x = 10; y= 50; 发现 x + y = 60 < 100 此处发生了脏读
t4: x = 10, y = 90 事务 A 执行结束
t5: 事务B x = 10; y = 90;

Non-Repeatable Read 不可重复读

同一个事务,2 次读取的值不一样。

案例同上,在 t2t5 时刻,事务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 丢失的更新

  1. 一个事务撤销时,把另一个已提交事务的更新数据覆盖了。
  2. 一个事务覆盖另一个事务已提交的数据。

Cursor Lost Update

Read Skew

Read Skew 发生在两个或者多个有完整性约束的数据上面

Write Skew

Consistency 一致性

相关文档

https://www.jianshu.com/p/3673e612cce2

https://jepsen.io/consistency/models

https://zinglix.xyz/2021/02/18/consistency-model/

https://www.cnblogs.com/open-source-java/p/10564836.html