一. 语法
1.查看事务的隔离级别
1 | select @@transaction_isolation; |
2. 设置隔离级别
(1) 全局设置(影响所有新会话)
1 | SET GLOBAL TRANSACTION ISOLATION LEVEL level_name; |
(2) 会话级设置(仅影响当前连接)
1 | SET SESSION TRANSACTION ISOLATION LEVEL level_name; |
例如:
1 | -- 查看事务隔离级别 |
二. 隔离级别对比
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 并发性能 |
|---|---|---|---|---|
| Read Uncommitted | ❌ | ❌ | ❌ | 最高 |
| Read Committed | ✅ | ❌ | ❌ | 高 |
| Repeatable Read (默认) | ✅ | ✅ | ❌ | 中 |
| Serializable | ✅ | ✅ | ✅ | 最低 |
三. 四个隔离级别
1. 读未提交(Read Uncommitted)
- 特点:事务可以读取其他事务未提交的修改(“脏读”)。
- 问题:
- 脏读:可能读取到未提交的中间数据,导致不一致。
- 不可重复读、幻读也可能发生。
- 适用场景:对一致性要求极低,允许脏读的高并发场景(实际很少使用)。
2. 读已提交(Read Committed)
- 特点:事务只能读取其他事务已提交的修改(避免脏读)。
- 问题:
- 不可重复读:同一事务中多次读取同一数据可能结果不同(因其他事务提交了修改)。
- 幻读:可能发生(如其他事务插入/删除了符合查询条件的行)。
3. 可重复读(Repeatable Read)
- 特点:
- 确保同一事务中多次读取同一数据的结果一致(避免脏读、不可重复读)。
- 通过锁定已读取的行(但不一定锁定范围)。
4. 串行化(Serializable)
- 特点:
- 最高隔离级别,事务串行执行(完全隔离)。
- 通过锁表或强制事务排序实现。
- 问题:
- 性能最低:并发能力大幅下降。
- 适用场景:严格要求一致性且并发量低的场景(如金融交易)。
注意:事务隔离级别越高,数据越安全,但性能越低