mysql的隔离级别

MySQL 的事务隔离级别是数据库保证事务 ACID 特性中 隔离性(Isolation) 的核心机制,用于解决多个并发事务同时操作数据时可能出现的 脏读、不可重复读、幻读 等问题。MySQL 定义了 4 种标准隔离级别(由低到高),不同级别对并发问题的解决程度和性能开销不同.

首先了解: 脏读、不可重复读,幻读的概念。

脏读:读到其他事务的临时数据,当事务回滚 读取的数据成为脏(无用)数据。

不可重复读:同一事务中,两次读数据可能不一致。期间数据被其他事务更新。

幻读:同一事务中两次读取到的数据量不相同,期间其他事物新加数据。

四种隔离级别及其作用

按隔离级别的从低到高(性能开销从小到大)

  1. 读未提交(Read UnCommitted)
    • 定义: 一个事务可以读到另一个未提交事务修改的数据。
    • 解决问题: 几乎解决不了隔离, 最低的隔离级别.
    • 存在问题: 脏读.
    • 适用场景: 极少, 对数据一致性要求低的, 追求极致性能.
  2. 读已提交(Read Commit)
    • 定义: 一个事务只能读取到另一个已提交事务修改的数据.
    • 解决问题: 脏读.
    • 存在问题: 不可重复度.
    • 适用场景: 大多数互联网业务(如电商订单, 支付), 平衡了一致性和并发性;
      • 用户查询余额时, 确保看到的是已经提交的交易结果(避免脏读), 但允许两次查询间余额被其他充值/消费事务修改(不可重复读可接受).
  3. 可重复读(Repeatable Read)
    • 定义: 同一个事务内, 多次查询同一数据的结果始终如一, 不受其他事务提交的影响(mysql的默认隔离级别).
    • 解决的问题: 不可重复读.
    • 存在的问题: 幻读
      • mysql的innodb引擎通过间隙锁机制, 在RR级别下可以避免部分幻读场景.
    • 适用场景: 对数据一致性要求较高的业务(如金融对账, 库存管理), 确保事务内的数据读取的稳定性.
      • 库存扣减事务中, 多次查询库存数量需要保持一致, 避免因为其他事务插入/修改导致计算错误.
  4. 串行化(Serilalizble)
    • 定义: 最高的隔离级别, 所有的事务串行执行(如同多线程) 完全禁止并发操作.
    • 解决的问题: 脏读, 不可重复度, 幻读 所有并发问题, 数据一致性最高.
    • 存在的问题: 并发性能极差, 可能导致大量事务阻塞, 仅适用于极特殊场景.
    • 适用场景: 对数据一致性要求极高, 不允许任何并发冲突的场景(如银行核心交易的记账环节).

mysql中隔离级别的配置与查看

查看当前的隔离级别

1
2
3
4
5
6
7
8
-- 查看全局隔离级别
SELECT @@global.transaction_isolation;
-- 查看当前会话隔离级别
SELECT @@transaction_isolation;
-- 设置全局隔离级别为读已提交
SET GLOBAL transaction_isolation = 'READ COMMITTED';
-- 设置当前会话隔离级别为可重复读
SET SESSION transaction_isolation = 'REPEATABLE READ';

总结

  • 隔离级别越高, 数据一致性越好,但是并发性能越差(锁的机制更严格).
  • mysql 默认适用的隔离级别是 可重复度(RR), 兼顾了一致性和性能, 适合大多数业务.
  • 选择隔离级别时需要权衡
    • 低级别(如 rc): 适合高并发, 对一致性要求不极致的场景( 如 社交, 内容平台).
    • 高级别(如 rr, Serilalizble): 适合对一致性要求高的场景(如金融, 库存).

mysql的隔离级别
https://zhaops-hub.github.io/2025/08/20/mysql/mysql的隔离级别/
作者
赵培胜
发布于
2025年8月20日
许可协议