ACID
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),它们四者谁是真正的老大:原子性是基础,隔离性是手段,持久性是目的,真正的老大就是一致性
隔离性
隔离性是手段,那么它具体有哪些手段,这些手段具体要解决什么问题呢?其实是为了解决数据在高并发下所产生的问题:
问题:
Dirty Read(脏读)
Unrepeatable Read(不可重复读)
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 已提交的新增数据。
第一条是坚决抵制的,后两条在大多数情况下可不作考虑。