Mysql的隔离级别
MySQL 的事务隔离级别是数据库保证事务 ACID 特性中 隔离性(Isolation) 的核心机制,用于解决多个并发事务同时操作数据时可能出现的 脏读、不可重复读、幻读 等问题。MySQL 定义了 4 种标准隔离级别(由低到高),不同级别对并发问题的解决程度和性能开销不同.
首先了解:脏读、不可重复读,幻读的概念。
脏读:读到其他事务的临时数据,当事务回滚 读取的数据成为脏(无用)数据。
不可重复读:同一事务中,两次读数据可能不一致。期间数据被其他事务更新。
幻读:同一事务中两次读取到的数据量不相同,期间其他事物新加数据。
四种隔离级别及作用
按隔离级别从低到高(性能开销从小到大)
- 读未提交(Read UnCommitted)
- 定义:一个事务可以读到另一个未提交事务修改的数据。
- 解决问题:几乎解决不了隔离。最低的隔离级别。
- 存在问题:脏读
- 适用场景: 极少,对数据一致性要求低的,追求极致性能。
- 读已提交(Read Commit)
- 定义:一个事务只能读取到另一个已提交事务修改的数据。
- 解决问题:脏读。
- 存在问题:不可重复读。
- 适用场景:大多数互联网业务(如电商订单、支付),平衡了一致性和并发性
- 用户查询余额时,确保看到的是已提交的交易结果(避免脏读),但允许两次查询间余额被其他充值 / 消费事务修改(不可重复读可接受)。
- 可重复读(Repeatable Read)
- 同一事务内,多次查询同一数据的结果始终如一,不受其他事务提交的影响(Mysql默认隔离级别)。
- 解决的问题:不可重复读
- 存在的问题:幻读
注:Mysql的innoDB引擎通过间隙锁机制,在RR级别下可以避免部分幻读场景。 - 适用场景:对数据一致性要求较高的业务(如金融对账、库存管理),确保事务内数据读取的稳定性。例如:
- 库存扣减事务中,多次查询库存数量需保持一致,避免因其他事务插入 / 修改导致计算错误。
- 串行化(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):适合对一致性要求高的场景(如金融、库存)。
6529

被折叠的 条评论
为什么被折叠?



