mysql的隔离级别
MySQL 的事务隔离级别是数据库保证事务 ACID 特性中 隔离性(Isolation) 的核心机制,用于解决多个并发事务同时操作数据时可能出现的 脏读、不可重复读、幻读 等问题。MySQL 定义了 4 种标准隔离级别(由低到高),不同级别对并发问题的解决程度和性能开销不同.
首先了解: 脏读、不可重复读,幻读的概念。
脏读:读到其他事务的临时数据,当事务回滚 读取的数据成为脏(无用)数据。
不可重复读:同一事务中,两次读数据可能不一致。期间数据被其他事务更新。
幻读:同一事务中两次读取到的数据量不相同,期间其他事物新加数据。
四种隔离级别及其作用
按隔离级别的从低到高(性能开销从小到大)
- 读未提交(Read UnCommitted)
- 定义: 一个事务可以读到另一个未提交事务修改的数据。
- 解决问题: 几乎解决不了隔离, 最低的隔离级别.
- 存在问题: 脏读.
- 适用场景: 极少, 对数据一致性要求低的, 追求极致性能.
- 读已提交(Read Commit)
- 定义: 一个事务只能读取到另一个已提交事务修改的数据.
- 解决问题: 脏读.
- 存在问题: 不可重复度.
- 适用场景: 大多数互联网业务(如电商订单, 支付), 平衡了一致性和并发性;
- 用户查询余额时, 确保看到的是已经提交的交易结果(避免脏读), 但允许两次查询间余额被其他充值/消费事务修改(不可重复读可接受).
- 可重复读(Repeatable Read)
- 定义: 同一个事务内, 多次查询同一数据的结果始终如一, 不受其他事务提交的影响(mysql的默认隔离级别).
- 解决的问题: 不可重复读.
- 存在的问题: 幻读
- mysql的innodb引擎通过间隙锁机制, 在RR级别下可以避免部分幻读场景.
- 适用场景: 对数据一致性要求较高的业务(如金融对账, 库存管理), 确保事务内的数据读取的稳定性.
- 库存扣减事务中, 多次查询库存数量需要保持一致, 避免因为其他事务插入/修改导致计算错误.
- 串行化(Serilalizble)
- 定义: 最高的隔离级别, 所有的事务串行执行(如同多线程) 完全禁止并发操作.
- 解决的问题: 脏读, 不可重复度, 幻读 所有并发问题, 数据一致性最高.
- 存在的问题: 并发性能极差, 可能导致大量事务阻塞, 仅适用于极特殊场景.
- 适用场景: 对数据一致性要求极高, 不允许任何并发冲突的场景(如银行核心交易的记账环节).
mysql中隔离级别的配置与查看
查看当前的隔离级别
1 | |
总结
- 隔离级别越高, 数据一致性越好,但是并发性能越差(锁的机制更严格).
- mysql 默认适用的隔离级别是 可重复度(RR), 兼顾了一致性和性能, 适合大多数业务.
- 选择隔离级别时需要权衡
- 低级别(如 rc): 适合高并发, 对一致性要求不极致的场景( 如 社交, 内容平台).
- 高级别(如 rr, Serilalizble): 适合对一致性要求高的场景(如金融, 库存).
mysql的隔离级别
https://zhaops-hub.github.io/2025/08/20/mysql/mysql的隔离级别/