MySQL提供了四种事务隔离级别,其中可重复读RR和可提交读RC是实际业务中使用频率最高的两个级别,两者的核心差异体现在事务执行过程中对数据可见性的控制规则上,不同的规则会直接影响业务的并发性能和数据一致性表现。

RR和RC的核心差异
RR即可重复读,是MySQL InnoDB引擎的默认隔离级别,它的核心特性是同一个事务内多次读取同一行数据的结果是一致的,不会受其他事务提交的影响。而RC即可提交读,事务内每次查询都会读取已经提交的最新数据,同一个事务内多次查询同一行可能得到不同的结果。
两者的差异主要体现在两个方面:
- 幻读的处理:RR通过Next-Key Lock机制可以避免幻读,而RC无法避免幻读问题。
- 锁的持有范围:RR的间隙锁范围更大,可能会锁住更多的数据范围,RC一般只锁住当前命中的行。
互联网并发场景下的选型分析
RC的使用场景
互联网业务大多以高并发、短事务为主,比如电商的商品查询、用户订单列表查询、社交动态拉取等场景,这类场景对性能要求更高,对可重复读的需求并不强烈。RC隔离级别下锁的粒度更小,事务之间的锁冲突概率更低,能够支撑更高的并发量,是这类场景的更优选择。
比如下面这个查询用户订单的示例,使用RC隔离级别可以减少锁等待:
-- 查询用户最近10条订单,使用RC隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; START TRANSACTION; SELECT order_id, order_amount, create_time FROM orders WHERE user_id = 123 ORDER BY create_time DESC LIMIT 10; COMMIT;
RR的使用场景
如果业务需要保证同一个事务内多次读取数据的一致性,或者需要避免幻读问题,比如财务对账、库存扣减的批量校验等场景,RR会更合适。这类场景对数据一致性的要求高于性能要求,RR的Next-Key Lock机制可以保证事务执行过程中数据的一致性。
下面是库存扣减的示例,使用RR隔离级别可以避免幻读导致的库存超扣:
-- 库存扣减场景,使用RR隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION; -- 查询当前库存,RR下多次查询结果一致 SELECT stock_num FROM product_stock WHERE product_id = 456 FOR UPDATE; -- 扣减库存 UPDATE product_stock SET stock_num = stock_num - 2 WHERE product_id = 456; COMMIT;
选型建议总结
结合互联网业务的普遍特点,可以遵循以下选型原则:
- 大部分普通业务场景优先选择RC隔离级别,能够提升并发性能,减少锁冲突。
- 涉及财务、库存等强一致性要求的场景,选择RR隔离级别,保证事务内数据的一致性。
- 如果业务已经使用了RR隔离级别且没有出现性能问题,不需要特意切换到RC,避免引入不必要的风险。
实际选型时还需要结合业务的具体事务长度、并发量级、数据一致性要求综合判断,不要盲目跟风选择某一种隔离级别。