当前位置: 首页 > 知识库问答 >
问题:

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

陆绍辉
2023-07-18

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

共有2个答案

慕容宇
2023-07-18

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

谷梁德容
2023-07-18

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

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

默认用rc就行

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

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

 类似资料:
  • 本文向大家介绍什么情况下需要创建MySQL索引?,包括了什么情况下需要创建MySQL索引?的使用技巧和注意事项,需要的朋友参考一下 索引可以提高数据的检索效率,也可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。排序分组操作主要消耗的就是CPU资源和内存,所以能够在排序分组操作中好好的利用索引将会极大地降低CPU资源的消耗。 如何判定是否需要创建索引? 1、较频繁地作为查询条件的字段

  • 基于中的评论https://www.jooq.org/doc/3.6/manual/sql-execution/transaction-management/对于Jooq来说,改变隔离级别似乎还不太可能。然而,不清楚Jooq设置的隔离级别是什么,因此我的问题是:Jooq使用的隔离级别是什么? 特别是,看起来我正在经历脏读,而我需要事务来防止这种情况。有人能确认Jooq事务阻止了脏读吗? 注意:将J

  • 本文向大家介绍请解释下什么是cookie隔离?为什么要隔离?如何隔离?相关面试题,主要包含被问及请解释下什么是cookie隔离?为什么要隔离?如何隔离?时的应答技巧和注意事项,需要的朋友参考一下 什么是 Cookie 隔离? 或者说:请求资源的时候不要让它带 cookie 怎么做 cookie 隔离技术和传统的多域名拆分请求,提高浏览器并发请求数有点类似,均是采用多域名来处理请求 传统做法是将 c

  • 问题内容: 因此,通过阅读一些文章,我得到的信息是能够实时修改字段并为类设置值,而无需重新编译。 所以有可能对没有源代码的第三方Java库创建的类执行此操作/是否可以在运行时使用反射来修改类实例? 在其他哪些情况下,通常还会使用反射? 我试图了解反射如何适用。 问题答案: 任何时候您在运行时处理字符串,并希望将该字符串的一部分视为语言中的标识符。 远程过程调用-将通过网络接收的消息的一部分视为方法

  • 本文向大家介绍浅析MYSQL REPEATABLE-READ隔离级别,包括了浅析MYSQL REPEATABLE-READ隔离级别的使用技巧和注意事项,需要的朋友参考一下 REPEATABLE-READ 即可重复读,set autocommit= 0或者START TRANSACTION状态下select表的内容不会改变。这种隔离级别可能导致读到的东西是已经修改过的。 比如: 回话一中读取一个字段

  • 当对部署/实时应用程序进行任何更改时,我们需要“重启”JBoss服务器的情况是什么? 即 -如果只是热交换一些(. js/. css/. jsp)文件完成。 -如果一些类被替换。 -如果我替换完整的. war文件。 ...等等。