隔离级别与并发三坑要点
- 四种级别:读未提交 / 读已提交 / 可重复读 / 串行化
- 脏读:读到别的事务还没提交的改动
- 不可重复读:同事务内两次读同一行结果变了
- 幻读:同查询两次返回的行集合变了
- MySQL 默认可重复读,已能挡住脏读与不可重复读
- 串行化最安全但最慢,靠锁把并发压成串行
隔离级别与并发三坑示例
-- 查看当前隔离级别
SELECT @@transaction_isolation;
-- 把当前会话调整为读已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 全局设置(需权限)
-- SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
隔离级别与并发三坑对照
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | 可能 | 可能 | 可能 |
| READ COMMITTED | 不会 | 可能 | 可能 |
| REPEATABLE READ | 不会 | 不会 | 基本不会 |
| SERIALIZABLE | 不会 | 不会 | 不会 |
避坑提醒:调隔离级别别一上来就串行化,先确认业务是否真会撞上幻读,多数场景可重复读已够用。