面试题:MySQL 默认的事务隔离级别是什么?为什么选择这个级别?

MySQL 默认的事务隔离级别

MySQL 的默认事务隔离级别是 可重复读(Repeatable Read)


为什么选择这个级别?

MySQL 选择 可重复读 作为默认隔离级别,主要基于以下原因:

1. 平衡一致性与性能

  • 可重复读 在保证较高数据一致性的同时,性能开销相对较低。
  • 它避免了 脏读 和 不可重复读,同时通过 间隙锁(Gap Lock) 和 临键锁(Next-Key Lock) 部分解决了 幻读 问题。
  • 相比于 串行化(Serializable),它的并发性能更高。

2. 适合大多数应用场景

  • 大多数应用场景对数据一致性有较高要求,但不需要完全避免幻读。
  • 可重复读 能够满足大多数业务需求,同时保持较高的并发性能。

3. MySQL 的实现机制

  • MySQL 的 InnoDB 存储引擎通过 多版本并发控制(MVCC) 和 锁机制 实现了 可重复读
  • 在 可重复读 隔离级别下:
    • 事务启动时会创建一个一致性视图(Consistent Read View),确保事务内多次读取的数据一致。
    • 通过 间隙锁 和 临键锁 防止其他事务在范围内插入新数据,从而部分避免了幻读。

4. 与标准 SQL 的差异

  • 根据 SQL 标准,可重复读 隔离级别并不要求完全避免幻读。
  • 但 MySQL 的 可重复读 通过额外的锁机制,部分解决了幻读问题,提供了比标准更高的数据一致性。

不同隔离级别的对比

隔离级别脏读不可重复读幻读性能
读未提交可能可能可能最高
读已提交避免可能可能较高
可重复读(默认)避免避免可能中等
串行化避免避免避免最低

如何查看和修改隔离级别?

1. 查看当前隔离级别

SELECT @@transaction_isolation;

2. 修改隔离级别

  • 全局修改:SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
  • 会话级别修改:SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  • 事务级别修改:SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

总结

MySQL 默认的 可重复读 隔离级别在数据一致性和性能之间取得了较好的平衡,适合大多数应用场景。如果需要更高的数据一致性,可以选择 串行化;如果对一致性要求较低,可以选择 读已提交 或 读未提交。根据业务需求选择合适的隔离级别是关键。

THE END
点赞5 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容