为什么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/wsdjdf.html