MySQL 默认的事务隔离级别是什么?为什么选择这个级别?

March 17, 2025 / 老大 / 7阅读 / 0评论/ 分类: 数据库

回答重点

MySQL默认的隔离级别是可重复读(Repeatable Read),即RR。

  1. 保证事务中的一致性读取。在同一事务中多次读取同一记录时,结果一致。

  2. 为了兼容早期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)

评论