为什么MySQL默认事务隔离级别是RR(8)

mysql>update users set c_note='t1' where c_id in (select  c_id from  class);

     
2      

mysql>set autocommit=0;

mysql>delete  from class where c_id=2;

mysql>commit;

 
3   mysql>update users set c_note='t2' where c_id in (select  c_id from  class);      
4   commit;      

因为binlog是按照commit时间的顺序保存,因此上述步骤在binlog里会以如下顺序存储:

binlog里的顺序   语句内容  
1  

delete  from class where c_id=2;

 
2   update users set c_note='t1' where c_id in (select  c_id from  class);  
3   update users set c_note='t2' where c_id in (select  c_id from  class);  

从库通过binlog应用后,最终的结果将导致主库的数据不一样(具体案例后续安装低版本后演示)。

因而,此种场景下很容易导致数据不一样。

4、总结

通过上述的实践,可以发现在RR级别下,binlog为任何格式均不会造成主从数据不一致的情况出现,但是当低版本MySQL使用RC+STATEMENT组合时(MySQL5.1.5前只有statement格式)将会导致主从数据不一致。当前这个历史遗漏问题以及解决,大家可以将其设置为RC+ROW组合的方式(例如Oracle等数据库隔离级别就是RC),而不是必须使用RR(会带来更多的锁等待),具体可以视情况选择。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/242a0710a19e832af14a4874fe1b70f0.html