2026-10-22 09:35:17
MySQL数据库的事务隔离级别用于控制事务间数据读取的隔离特性,主要解决脏读、不可重复读和幻读问题,共有四种隔离级别:RU(读未提交)、RC(读已提交)、RR(可重复读)和SR(可串行化),不同级别对并发性和数据一致性的权衡不同。
RU(READ-UNCOMMITTED,读未提交)
特性:允许事务读取其他事务未提交的数据,隔离性最差。
问题:
脏读:事务A修改数据但未提交,事务B读取到未提交的修改;若事务A回滚,事务B读取的数据无效。
不可重复读:同一事务内多次读取同一数据,结果可能因其他事务的修改而不同。
幻读:同一事务内多次查询满足条件的记录数,结果可能因其他事务的插入或删除而不同。
示例:
事务A执行UPDATE t1 SET a=10 WHERE id=1但未提交,事务B查询id=1的记录,读取到a=10;若事务A回滚,事务B再次查询会得到原始值a=5,导致数据不一致。
RC(READ-COMMITTED,读已提交)
特性:事务只能读取其他事务已提交的数据,隔离性一般。
问题:
不可重复读:同一事务内多次读取同一数据,结果可能因其他事务的提交而不同。
幻读:同RU级别。
优势:避免脏读。
示例:
事务A提交UPDATE t1 SET a=10 WHERE id=1后,事务B再次查询id=1的记录,读取到更新后的值a=10,与之前查询的a=5不同。
RR(REPEATABLE-READ,可重复读,MySQL默认级别)
特性:同一事务内多次读取同一数据,结果一致,隔离性较高。
问题:
幻读:通过多版本并发控制(MVCC)和间隙锁(Next-Key Lock)解决大部分幻读问题,但在特定场景下仍可能出现。
优势:避免脏读和不可重复读。
代价:锁开销较大,可能降低并发性能。
示例:
事务B在事务A提交前多次查询id=1的记录,结果始终为a=5;事务A提交后,事务B仍需提交或开启新事务才能看到更新后的值a=10。
SR(SERIALIZABLE,可串行化)
特性:最高隔离级别,通过强制事务串行执行确保数据一致性。
问题:
并发性差:所有读操作加锁,可能导致大量事务阻塞。
优势:完全避免脏读、不可重复读和幻读。
示例:
事务A执行SELECT * FROM t1 WHERE a>5时加锁,事务B需等待事务A释放锁后才能执行相同查询,确保结果一致。
事务隔离级别操作命令
关键名词解析
总结
官方文档链接: