事务隔离级别
隔离级别定义了一个事务与其他并发事务之间的隔离程度,用于解决并发事务可能产生的问题。
并发事务可能产生的问题
脏读-Dirty-Read、不可重复读-Non-repeatable-Read、幻读-Phantom-Read
四种隔离级别
READ_UNCOMMITTED(读未提交)
- 允许读取未提交的数据
- 可能出现脏读、不可重复读、幻读
- 性能最好,但安全性最差
READ_COMMITTED(读已提交)
- 只能读取已提交的数据
- 防止脏读,但可能出现不可重复读、幻读
- 互联网场景最常用,Oracle、SQL Server默认级别
REPEATABLE_READ(可重复读)
- 同一事务内多次读取同一数据,结果一致
- 防止脏读、不可重复读,但可能出现幻读
- MySQL默认级别
SERIALIZABLE(串行化)
- 事务完全串行化执行,最高隔离级别
- 防止脏读、不可重复读、幻读
- 性能最差,并发能力最低
隔离级别对比表
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 |
|---|---|---|---|---|
| READ_UNCOMMITTED 读未提交 | ✅ | ✅ | ✅ | 最高 |
| READ_COMMITTED 读已提交 | ❌ | ✅ | ✅ | 高 |
| REPEATABLE_READ 可重复读 | ❌ | ❌ | ✅ | 中 |
| SERIALIZABLE 串行化 | ❌ | ❌ | ❌ | 最低 |
隔离级别的选择:
- READ_COMMITTED:大多数互联网场景使用,防止脏读,性能较好
- REPEATABLE_READ:需要保证同一事务内多次读取一致时使用
- SERIALIZABLE:对数据一致性要求极高时使用,并发性能差