我的阿里二面,为什么MySQL选择Repeatable Read作为默认隔离级别?
这是我之前面试的时候,问过候选人的一个问题。 很多人认为这个问题没有意义,这不是在逼着我们背八股文么? 但是其实并不是,如果你能耐心的看完这篇文章,你就会发现我的良苦用心。
MySQL在主从复制的过程中,数据的同步是通过bin log进行的,简单理解就是主服务器把数据变更记录到bin log中,然后再把bin log同步传输给从服务器,从服务器接收到bin log之后,再把其中的数据恢复到自己的数据库存储中。
CREATE TABLE t1 (
a int(11) DEFAULT NULL,
b int(11) DEFAULT NULL,
KEY a (a)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into t1 values(10,2),(20,1);
以上两个事务执行之后,数据库里面的记录会变成(11,2)和(20,2),这个发上在主库的数据变更大家都能理解。
UPDATE t1 SET b=2 where b=1;
会被优先记录,然后再记录UPDATE t1 SET a=11 where b=2;
(再次提醒:statement格式的bin log记录的是SQL语句的原文)UPDATE t1 SET b=2 where b=1;
,再执行UPDATE t1 SET a=11 where b=2;
。ERROR 1598 (HY000): Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'
现在你还觉得这个问题没有意义吗? 我其实是想通过这样一个看似无意义的问题,延展出更多的知识,这样可以更加全方位的了解候选人。
欢迎关注微信公众号:互联网全栈架构,收取更多有价值的信息。
评论