面试题:MySQL 中的事务隔离级别有哪些?

在 MySQL 中,事务隔离级别定义了事务在并发操作时的可见性和一致性规则。MySQL 支持四种标准的事务隔离级别,从低到高分别是:


1. 读未提交(Read Uncommitted)

  • 定义:事务可以读取其他事务未提交的数据。
  • 特点
    • 最低的隔离级别,性能最高。
    • 可能导致 脏读不可重复读 和 幻读
  • 适用场景:对数据一致性要求极低,且需要高并发的场景。

2. 读已提交(Read Committed)

  • 定义:事务只能读取其他事务已提交的数据。
  • 特点
    • 避免了 脏读,但可能发生 不可重复读 和 幻读
    • 是许多数据库系统(如 Oracle)的默认隔离级别。
  • 适用场景:对数据一致性有一定要求,但允许不可重复读和幻读的场景。

3. 可重复读(Repeatable Read)

  • 定义:事务在执行期间多次读取同一数据时,结果一致。
  • 特点
    • 避免了 脏读 和 不可重复读
    • 在 MySQL 中,通过 间隙锁(Gap Lock) 和 临键锁(Next-Key Lock) 部分避免了 幻读
    • 是 MySQL InnoDB 存储引擎的默认隔离级别。
  • 适用场景:对数据一致性要求较高,且需要平衡性能的场景。

4. 串行化(Serializable)

  • 定义:事务完全串行执行,避免所有并发问题。
  • 特点
    • 最高的隔离级别,完全避免了 脏读不可重复读 和 幻读
    • 通过加锁实现,性能最低。
  • 适用场景:对数据一致性要求极高,且并发性能不是主要考虑的场景。

对比总结

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

如何查看和设置隔离级别?

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
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容