ACID
| 特性 | 作用 | |
|---|---|---|
| Atomicity | 原子性 | 一个事务里N个操作当成一个整体去执行,一个事务里N个操作要么全部执行,要么都不执行。 |
| Consistency | 一致性 | 数据一致性 / 约束一致性 |
| Isolation | 隔离性 | 一个事务的执行不能被其他事务干扰 |
| Durability | 持久性 | 保存到磁盘 |
graph LR
acid(事务特性)
acid --> a(一致性)
acid --> c(原子性)
acid --> i(持久性)
acid --> d(隔离性)
a --> ad(数据一致性 : 保证数据完整)
c --> c1(一个事务内所有操作全部执行/全部不执行)
i --> i1(WAL日志先行:undo log/redo log) --> i2(持久化到磁盘)
d --> d1(隔离级别) --> mvcc(MVCC:多版本并发控制)
d1 --> lbcc(LBCC:基于锁的并发控制)
lbcc --> record(record lock - 记录锁)
lbcc --> gap(gap lock - 间隙锁)
lbcc --> nextKey(next key lock - 临键锁 = record + gap)
一、Atomicity 原子性
undo log则是事务原子性和隔离性实现的基础。
二、Isolation 隔离性
| 无隔离性所引发的问题 | |
|---|---|
| 脏读 | 一个事务读取到了另一个事务修改但未提交的数据 |
| 不可重复读Read committed | 一个事务中多次读取同一行记录的结果不一致。 |
| 幻读 | 一个事务中多次按相同条件查询,结果不一致。后续查询的结果和面前查询结果不同,多了或少了几行记录。 |
| 隔离级别 | 解决问题 | |
|---|---|---|
| Read uncommitted | 读未提交 | |
| Read committed | 读已提交 | 脏读 |
| Repeatable read | 可重复读 | 不可重复读 |
| Serializable | 串行读 | 幻读 |
MVCC
读已提交 和 可重复读 两个隔离级别由MVCC实现。 而MVCC的实现其中就依赖了undo log。
三、Durability 持久性
Mysql持久化并不会先刷到磁盘,而是先写redo log再持久化到磁盘。
当Mysql故障时,可以读取redo log对数据进行恢复(并非可以全部恢复)。
四、Consistency 一致性
数据一致性:
是由原子性、持久性、隔离性共同保证的结果