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(会带来更多的锁等待),具体可以视情况选择。