MySQL默认的事务隔是什么?为什么选择这个级别?

53 阅读2分钟

MySQL默认的事务隔是什么?为什么选择这个级别?

重要内容

MySQL的默认事务隔离级别是 可重复读 RR

选择该级别的原因

  • 性能与一致性的平衡
    • MySQL的InnoDB存储引擎通过**多版本并发控制 MVCC 以及 临键锁 Next-Key Locking ** 机制解决了可重复读会出现幻读的问题
    • 相较于串行化有很好的性能优势,维持较高的高并发吞吐
  • 兼容早期 binlog 的 statement 格式问题

扩展知识

兼容早期 binlog 的 statement 格式问题

MySQL 早期版本(5.1 之前)默认使用 STATEMENT 格式的二进制日志(binlog),这种格式通过记录 SQL 语句原文实现主从复制。然而,这种设计在特定事务隔离级别下存在数据一致性风险

案例:例如有两个事务A和B 执行以下两个操作

  • 主库事务A:DELETE FROM t1 WHERE b < 100
  • 主库事务B:INSERT INTO t1 VALUES (10, 99)

在读已提交隔离级别且手动提交事务的情况下,会出现主库事务B会在主库事务A 之前提交了,这就会导致插入的数据也被删除,导致主从数据库不一致的问题

根本原因STATEMENT 格式仅记录 SQL 原文,不依赖行数据状态,因此事务执行顺序直接影响结果

与其他数据库的对比

  • Oracle/SQL Server:默认使用读已提交 RC ,因其更注重高并发场景,且通过其他机制(如乐观锁)补充一致性
  • PostgreSQL:默认使用读已提交 RC,同时也支持“可重复读”并通过快照隔离实现更强一致性(与MySQL的RR机制不同)