004-Mysql中隔离级别RC与RR的区别

1. Mysql中隔离级别RC与RR的区别


2. 参考网址:

  • Mysql中隔离级别RC与RR的区别
  • MySQL RR RC 隔离级别锁测试

  • MySQL 主键索引在 RR 和 RC 隔离级别下的加锁情况总结
  • MySQL 唯一索引在 RR 和 RC 隔离级别下的加锁情况总结
  • MySQL 二级索引在 RR 和 RC 隔离级别下的加锁情况总结

3.总结

  • RR 支持 gap lock(next-key lock),而RC则没有gap lock。因为MySQL的RR需要gap lock来解决幻读问题。而RC隔离级别则是允许存在不可重复读和幻读的。所以RC的并发一般要好于RR;
  • RC 隔离级别,通过 where 条件走非索引列过滤之后,不符合条件的记录上的行锁,会释放掉(虽然这里破坏了“两阶段加锁原则”);但是RR隔离级别,通过 where 条件走非索引列过滤之后,即使不符合where条件的记录,也是会加行锁。所以从锁方面来看,RC的并发应该要好于RR;可以减少一部分锁竞争,减少死锁和锁超时的概率。
  • RC 隔离级别不支持 statement 格式的bin log,因为该格式的复制,会导致主从数据的不一致;只能使用 mixed 或者 row 格式的bin log; 这也是为什么MySQL默认使用RR隔离级别的原因。复制时,我们最好使用:binlog_format=row
  • MySQL5.6 的早期版本,RC隔离级别是可以设置成使用statement格式的bin log,后期版本则会直接报错;

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


4.查询示例

1)等值查询


2)范围查询


3)查询结果为空

你可能感兴趣的:(004-Mysql中隔离级别RC与RR的区别)