事务隔离级别是数据库管理系统(DBMS)中用于控制并发事务之间相互影响的程度。它定义了一个事务在访问数据时,是否能看到其他事务的中间状态或未提交的数据。SQL 标准中定义了四种事务隔离。
四种事务隔离级别
- 隔离级别概述
隔离级别 | 说明 | 存在问题 |
---|---|---|
Read Uncommited | 允许事务读未提交的事务 | 脏读 |
Read commited | 只能读已提交的事务 | 不可重复读 |
Repeatable Read | 同一事务中多次读取结果(不可重复读解决) | 幻读 |
Serializable | 严格的隔离级别,事务完全串行执行 | 无并发问题,性能低 |
- 详细描述
(1)Read Uncommited(读取未提交)
- 描述:事务可以读取其他事务未提交的数据。
- 优点:最低隔离级别,性能较高。
- 可能出现脏读,即一个事务读取到另一个未提交事务的修改,导致数据不一致。
- 适用场景:对数据一致性要求不高的场景。
- 示例:
- 事务A修改了数据但是未提交
- 事务B读取了事务A修改的数据
- 如果事务A回滚了,事务B读取的数据就无效
(2)Read Commited(读取已提交)
- 描述:事务只能读取其他事务以及提交的数据
- 优点:避免了脏读
- 缺点:可能出现不可重复读的情况,即同一个事务中多次读取同一条数据,结果可能不同
- 适用场景:大多数系统的默认隔离级别(如 Oracle 和 SQL Server)。
- 示例:
- 事务A读取了数据
- 事务B修改了该数据并提交
- 事务A再次读取数据,发现结果与第一次结果不一致
(3)Repeatable Read(可重复读)
- 描述:在同一个事务中,多次读取结果一致,避免了不可重复读的情况
- 优点:避免了脏读和不可重复读问题
- 缺点:可能出现幻读,即同一事务中执行范围查询,其他事务插入了符合条件的数据
- 适用场景:MySQL的默认隔离级别
- 示例:
- 事务A查询某个条件的数据范围
- 事务B插入了一条符合的查询范围的数据
- 事务A再次查询,发现结果多了一条数据
(4)Serializable(可串行化)
- 描述:最高隔离级别,事务按顺序逐一执行,完全避免并发问题
- 优点:解决了脏读、不可重复读和幻读问题。
- 缺点:性能最低,通常通过锁机制实现,可能导致大量阻塞。
- 使用场景:对数据一致性要求极高,且并发量较低的场景。
- 实现方式
- 悲观锁: 通过加锁保证事务串行执行。
- MVCC: 通过多版本并发控制(MySQL InnoDB 在 Repeatable Read 中使用)。
MVCC(多版本并发控制器)
原理:
- 在可重复读和读取已提交隔离级别下,MySQL 的 InnoDB 存储引擎使用 MVCC 解决并发问题。
- 每条记录维护多个版本(隐藏的行版本号 trx_id 和回滚指针 undo log)。通过时间戳确保事务只读到符合当前时间点的数据。
特点:
- 读取操作不加锁,依赖快照,性能高。
- 适用于 Read Committed 和 Repeatable Read。
MySQL 中的事务隔离级别
在 MySQL 中,可以通过以下命令查看或设置隔离级别:
查看当前隔离级别:
SELECT @@transaction_isolation;
设置隔离级别:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
设置全局隔离级别:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。