隔离级别解决什么问题
并发事务之间会互相干扰,典型表现有三种:脏读(读到了别人未提交的数据)、不可重复读(同一事务内两次读到不同结果)、幻读(同一条件两次查出不同的行数)。隔离级别就是在这三种现象与并发性能之间做取舍:级别越高越安全,锁等待与死锁概率也越高。InnoDB 在可重复读级别下用间隙锁减少幻读,这也是它与其他数据库略有不同的地方。
基本信息
| 适用平台 | MySQL 5.7 / 8.0 的 InnoDB,默认 REPEATABLE READ |
|---|---|
| 查看方式 | SELECT @@transaction_isolation |
| 设置方式 | SET SESSION / SET GLOBAL TRANSACTION ISOLATION LEVEL |
| 生效范围 | 全局设置只影响新建连接 |
| 前提条件 | binlog_format 为 ROW 时才能安全使用 RC |
典型使用场景
- 高并发写入场景锁等待明显,评估从默认级别降级到 RC
- 报表类只读查询需要稳定结果集,考虑保持 RR
- 排查偶发数据不一致:先确认当前隔离级别与业务假设是否一致
- 迁移适配:对齐源数据库默认级别,减少行为差异
- 切换前评估:梳理依赖重复读语义的批处理逻辑
查看与设置
查看与设置
-- 查看当前会话与全局设置
SELECT @@transaction_isolation;
SELECT @@global.transaction_isolation;
-- 会话级切换,适合先在单个连接上验证
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 全局切换:只影响之后新建的连接
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
-- 切换前确认二进制日志格式
SHOW VARIABLES LIKE 'binlog_format';隔离级别对照
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | 可能 | 可能 | 可能 |
| READ COMMITTED | 不会 | 可能 | 可能 |
| REPEATABLE READ | 不会 | 不会 | 基本不会(间隙锁) |
| SERIALIZABLE | 不会 | 不会 | 不会,并发度最低 |
互联网业务常用 RC 降低锁冲突:切换前必须复核依赖重复读语义的逻辑,尤其是分页统计、批量对账这类需要稳定快照的任务。
全局设置只对新连接生效:切换后老连接仍保持原级别,出现同一实例内不同会话行为不一致的情况,需要确认应用是否重建了连接池。