首页/数据/数据库速查/事务隔离级别与并发现象
SQL 语法52 条

事务隔离级别与并发现象

四种隔离级别的取舍:脏读、不可重复读、幻读;InnoDB 在 RR 下用间隙锁减少幻读,代价是更多锁等待。

数据库速查数据更新于 2026-10-13

隔离级别解决什么问题

并发事务之间会互相干扰,典型表现有三种:脏读(读到了别人未提交的数据)、不可重复读(同一事务内两次读到不同结果)、幻读(同一条件两次查出不同的行数)。隔离级别就是在这三种现象与并发性能之间做取舍:级别越高越安全,锁等待与死锁概率也越高。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 降低锁冲突:切换前必须复核依赖重复读语义的逻辑,尤其是分页统计、批量对账这类需要稳定快照的任务。
全局设置只对新连接生效:切换后老连接仍保持原级别,出现同一实例内不同会话行为不一致的情况,需要确认应用是否重建了连接池。

易错点

  • 切到 RC 后不评估业务假设:依赖可重复读的批次逻辑出现数据漂移,问题常在结算时集中暴露
  • 以为改全局参数立即对所有连接生效:老连接保持原级别,验证时必须新建连接
  • 在 RC 下仍用不加锁的读-改-写:并发竞争下出现丢失更新,需要显式加锁或原子更新
  • 把隔离级别当成解决并发的万能方案:很多不一致来自应用层的读改写顺序,而不是数据库级别设置

数据来源与参考

  • MySQL 8.0 Reference Manual: Transaction Isolation Levels

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌