提到事务,你肯定会想到 ACID(Atomicity、Consistency、Isolation、Durability,
即原子性、一致性、隔离性、持久性),今天我们就来说说其中 I,也就是“隔离性”。
当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。
ACID 概述
A : atomicity 原子性。原子性是我们对事务最直观的理解:事务就是一系列的操作,要么全部都执行,要么全部都不执行。
C : consistency 一致性。数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款和不变。
I : isolation 隔离性。在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
D : durability 持久性。只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
事务隔离级别
读未提交:一个事务还未提交,它所做的变更就可以被别的事务看到
读提交:一个事务提交之后,它所做的变更才可以被别的事务看到
可重复读:一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的
串行化:对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行
隔离级别问题
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
| —————— | —————— | —————— |
| 读未提交(read uncommitted) | ☑️ | ☑️ | ☑️|
| 读提交(read committed)| ✖️ | ☑️ | ☑️ |
| 可重复读(repeatable read)| ✖️ | ✖️ | ☑️|
| 串行化(serializable )| ✖️ | ✖️ | ✖️ |
注:MySql InnoDB 5.6版本之后 可重复读通过Gap锁(间隙锁)解决幻读问题
