有什么情况下,需要把mysql的隔离级别改成RC吗?谁生产环境上用过?

有什么样的业务,必须要用RC隔离级别,所以迫不得已去改数据库的隔离级别吗?

阅读 2.3k
2 个回答

有什么样的业务,必须要用RC隔离级别?——需要读已提交的业务

必须用rc是相对读未提交而言,不是相对可重复读,你需要读已提交就用读已提交

默认用rc就行

比如django,不管你用 pgsql 还是 mysql,都默认改成rc

如果你需要重复读,就改成可重复读

1、RC 与 RR 在锁方面的区别

  • RR 支持 gap lock(next-key lock)而RC则没有gap lock,因为MySQL的RR需要gap lock来解决幻读问题。而RC隔离级别则是允许存在不可重复读和幻读的。所以RC的并发一般要好于RR
  • RC 隔离级别通过 where 条件过滤之后不符合条件的记录上的行锁会释放掉(虽然这里破坏了“两阶段加锁原则”)但是RR隔离级别即使不符合where条件的记录也不会是否行锁和gap lock所以从锁方面来看RC的并发应该要好于RR另外 insert into t select ... from s where 语句在s表上的锁也是不一样的
    2、RC 与 RR 在复制方面的区别
    RC 隔离级别不支持 statement 格式的bin log因为该格式的复制会导致主从数据的不一致只能使用 mixed 或者 row 格式的bin log; 这也是为什么MySQL默认使用RR隔离级别的原因。复制时最好使用binlog_format。

3、 RC 与 RR 在一致性读方面的区别

RC隔离级别时事务中的每一条select语句会读取到他自己执行时已经提交了的记录也就是每一条select都有自己的一致性读ReadView; 而RR隔离级别时事务中的一致性读的ReadView是以第一条select语句的运行时作为本事务的一致性读snapshot的建立时间点的。只能读取该时间点之前已经提交的数据。

4、RC 支持半一致性读RR不支持

RC隔离级别下的update语句使用的是半一致性读(semi consistent)而RR隔离级别的update语句使用的是当前读当前都会发生锁的阻塞。

而半一致性读可以减少了update语句时行锁的冲突对于不满足update更新条件的记录可以提前放锁减少并发冲突的概率。

总的而言,当你某些表涉及到搞并发,比如钱包表,流水表这种情况容易造成死锁,
你可以看看这篇文章了解一下RR与RC的区别https://zhuanlan.zhihu.com/p/442465757

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题