Mysql的隔离级别

Mysql的隔离级别

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

首先了解:脏读、不可重复读,幻读的概念。
脏读:读到其他事务的临时数据,当事务回滚 读取的数据成为脏(无用)数据。
不可重复读:同一事务中,两次读数据可能不一致。期间数据被其他事务更新。
幻读:同一事务中两次读取到的数据量不相同,期间其他事物新加数据。

四种隔离级别及作用

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

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

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

1、查看当前隔离级别

-- 查看全局隔离级别
SELECT @@global.transaction_isolation;
-- 查看当前会话隔离级别
SELECT @@transaction_isolation;

2、修改隔离级别(全局或者会话级别)

-- 设置全局隔离级别为读已提交
SET GLOBAL transaction_isolation = 'READ COMMITTED';
-- 设置当前会话隔离级别为可重复读
SET SESSION transaction_isolation = 'REPEATABLE READ';

总结:

  • 隔离级别越高,数据一致性越好,但并发性能越差(因锁机制更严格)。
  • MySQL 默认使用 可重复读(RR),兼顾了一致性和性能,适合大多数业务。
  • 选择隔离级别时需权衡:
    • 低级别(如 RC):适合高并发、对一致性要求不极致的场景(如社交、内容平台)。
    • 高级别(如 RR、Serializable):适合对一致性要求高的场景(如金融、库存)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值