一. 提交读(RC) or 可重复读(RR)
大家都知道mysql的默认隔离级别是RR(可重复读),然而oracle只支持提交读和串行化。那我们在实际场景中到底用的哪种隔离级别比较多呢?答案是:提交读!
- 缘由一:在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多!
- 缘由二:在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行
- 缘由三:在RC隔离级别下,半一致性读(semi-consistent)特性增加了update操作的并发性!
重复读中有gap锁大大增加了锁等待和死锁概率 ,很大程度上要求你要保证不同事务内的相同逻辑sql的顺序性(这个不好理解 你需要多想下) ,提交读相比重复读 他的并发性得到了一个很好的保证(锁等待少)从所以在真实业务场景下,当我们修改一组数据时, 这组数据是否需要保证一致性,如果一致性要求没那么强,可以使用提交读 (事务内 多次查询数据 有可能不一致) ,这样你并发会提高很多 减少了锁冲突的概率,代码也会写的飞起(不用考虑那么多了哈)
二. 为什么mysql默认为可重复读?
既然真实业务场景中我们使用的是提交读,那为什么mysql默认隔离级别要设为可重复读呢?
这个是有历史原因的,当然要从我们的主从复制开始讲起了!
主从复制,是基于什么复制的?
是基于binlog复制的!这里不想去搬binlog的概念了,就简单理解为binlog是一个记录