本文将总结 MySQL 的四种事务隔离级别。数据库的事务是指一组对数据的操作,要么全部成功,要么全部失败。只要其中有一步进行失败,就会把已经完成的部分进行回滚操作(撤销)。事务具有四个特性,原子性 (Atomicity),一致性 (Consistency),隔离性 (Isolation) 和持久性 (Durability),即 ACID。因此,了解 MySQL 支持的隔离级别至关重要。
MySQL 支持几种数据引擎,以下介绍的事务隔离级别是指在 InnoDB 引擎下,MyISAM 是不支持事务的。SQL 标准定义了四种隔离级别,MySQL 都支持,它们分别是:
- 读未提交 (read uncommitted)
- 读已提交 (read committed)
- 可重复读 (repeatable read)
- 串行化 (serializable)
区分不同的隔离级别是为了解决实际并发操作数据库时遇到的事务问题,MySQL 的事务隔离是通过锁来解决的。因此,这些隔离级别从上往下,隔离强度逐渐增强(即可以解决的问题越多),但是性能逐渐变差(并发性)。可重复读是 MySQL 的默认隔离级别。
读未提交
在这种隔离级别下,是不加锁的,因此最简单的脏读的问题都无法解决。脏读是指,一个事务可能会读取到其他事务没有提交的对数据的修改。因为这种情况下,任何事务对数据的修改,都会直接暴露给其他事务,即使事务没有提交。
读已提交
这种隔离级别是为了解决上文提到的脏读问题。
在这种隔离级别下,使用行锁,读完释放。因此,事务读取数据的时候,其他事务无法修改这一数据。从结果上看,事务只能读取到其他事务已经提交的数据。
可重复读
这种隔离界别是为了解决读已提交中可能遇到的不可重复问题,不可重复读问题是指,如果一个事务修改了另一个未提交事务读取的数据。
串行化
这种隔离界别是为了解决读已提交中可能遇到的幻读问题,幻读问题是指,如果一个事务先根据某些搜索条件查询出了一些记录,在事务未提交时,另一个事务写入了也符合那些搜索条件的记录(如 INSERT新数据, UPDATE 还未读到的数据)。
总结
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交 | 可能 | 可能 | 可能 |
| 读已提交 | 不可能 | 可能 | 可能 |
| 可重复读 | 不可能 | 不可能 | 可能 |
| 串行化 | 不可能 | 不可能 | 不可能 |
如果文中有问题,欢迎评论交流~