老男孩教育 | 面试被问烂的 MySQL 数据库服务隔离级别,建议收藏!

大神们,我想请问下,老男孩教育 | 面试被问烂的 MySQL 数据库服务隔离级别,建议收藏!
最新回答
温柔少女控

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释放锁后才能执行相同查询,确保结果一致。

事务隔离级别操作命令

  • 查看当前隔离级别:SELECT @@transaction_isolation;
  • 设置全局隔离级别:SET GLOBAL transaction_isolation='READ-UNCOMMITTED';SET GLOBAL transaction_isolation='READ-COMMITTED';SET GLOBAL transaction_isolation='REPEATABLE-READ';SET GLOBAL transaction_isolation='SERIALIZABLE';
  • 临时关闭自动提交:SET GLOBAL autocommit=0;SELECT @@autocommit;

关键名词解析

  • 脏读:读取到其他事务未提交的修改,可能导致数据不一致。
  • 不可重复读:同一事务内多次读取同一数据,结果因其他事务的提交而不同。
  • 幻读:同一事务内多次查询满足条件的记录数,结果因其他事务的插入或删除而不同。

总结

  • RU:并发性高,但数据一致性差,适用于对一致性要求不高的场景。
  • RC:平衡并发性和一致性,适用于大多数业务场景。
  • RR:MySQL默认级别,适合需要高一致性且可接受一定锁开销的场景。
  • SR:数据一致性最高,但并发性最低,适用于严格一致性的场景(如金融交易)。

官方文档链接:

MySQL事务隔离级别