MySQL 默认的事务隔离级别是什么?为什么选择这个级别?
回答重点
MySQL默认的隔离级别是可重复读(Repeatable Read),即RR。
保证事务中的一致性读取。在同一事务中多次读取同一记录时,结果一致。
为了兼容早期binlog的statement格式问题,如果是使用读已提交、读未提交等隔离级别,使用了statement格式的binlog会导致主从(备)数据库数据不一致的问题。
扩展(binlog statement格式和可重复读级别的影响)
MySQL在使用过程中,为了避免单台故障,需要使用主从(备)机制:也就是除了主数据库外,还有一个从数据库,主从之间数据同步,如果主数据库挂了,客户端可以使用从数据库。
主从复制
简单模拟主从复制操作
主库操作
1)事务A
BEGIN;
DELETE FROM a WHERE b <= 5; -- 删除表中 b <= 5 的所有记录(未提交)。
2)事务B
BEGIN;
INSERT INTO a VALUES(3); -- 插入一条新记录 b = 3。
COMMIT;
3)事务A
COMMIT;
最终主库a表中存在b=3的记录。
从库操作
重放从主库发送过来的binlog以同步数据,但是在从库中,因为主库使用的是statement格式的binlog(记录的是原先的SQL语句,事务谁先提交记录谁),SQL的执行顺序在从库上就可能编程先插入b=3的记录,再删除b<=5的记录。
最终从库a表为空,数据不一致。
可重复读如何解决主从复制数据不一致的问题?
在可重复读隔离级别下,事务A会对b<=5的数据使用间隙锁Gap Locks、临键锁(Next-Key Locks),阻塞其他事物(如事务B)在该范围内插入新的数据(b=3)。由于事务B无法插入数据,主库b=3的插入操作不会发生,从而避免了主从数据库数据不一致的问题。
#MySQL(21)评论