ACID

ACID

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),它们四者谁是真正的老大:原子性是基础,隔离性是手段,持久性是目的,真正的老大就是一致性

隔离性

隔离性是手段,那么它具体有哪些手段,这些手段具体要解决什么问题呢?其实是为了解决数据在高并发下所产生的问题:

问题:

  1. Dirty Read(脏读)

  2. Unrepeatable Read(不可重复读)

  3. Phantom Read(幻读)

脏读
时间 事务A(存库) 事务B
T1 开始事务
T2 开始事务
T3 查询余额(1000元)
T4 取出1000元(余额0元)
T5 查询余额(0元)
T6 撤销事务(余额1000元)
T7 存入500元(余额500)
T8 提交事务

余额应该为 1500 元才对!请看 T5 时间点,事务 A 此时查询余额为 0 元,这个数据就是脏数据,它是事务 B 造成的。

不可重复读
时间 事务A(存库) 事务B
T1 开始事务
T2 开始事务
T3 查询余额(1000元)
T4 查询余额(1000元)
T5 取出1000元(余额0元)
T6 提交事务
T7 查询余额(0元)

事务 A 其实除了查询了两次以外,其他什么事情都没有做,结果钱就从 1000 变成 0 了,这就是重复读了

幻读
时间 事务A(存库) 事务B
T1 开始事务
T2 开始事务
T3
T4 统计总存款(10000元)
T5 存入100元
T6 提交事务
T7 统计总存款(10100元)

银行工作人员,每次统计总存款,都看到不一样的结果。不过这也确实也挺正常的,总存款增多了,肯定是这个时候有人在存钱。但是银行的系统对于这个是不允许的。


归纳一下,以上提到了事务并发所引起的跟读取数据有关的问题,各用一句话来描述一下:

脏读:事务 A 读取了事务 B 未提交的数据,并在这个基础上又做了其他操作。

不可重复读:事务 A 读取了事务 B 已提交的更改数据。

幻读:事务 A 读取了事务 B 已提交的新增数据。

第一条是坚决抵制的,后两条在大多数情况下可不作考虑。


你可能感兴趣的:(ACID)