MySQL为什么使用可重复读隔离级别?

发布时间 2023-05-06 11:00:10作者: 森林中大鸟

历史原因:早期MySQL的binlog日志只有statement格式,在读已提交的隔离界别下,binlog日志存在bug,会导致主从复制不一致的情况。因此默认的隔离级别使用可重复读。

bug:binlog日志中记录的语句顺序和原有顺序会不一致。先删除后插入的操作,同步导从库就变成了先插入后删除的操作了。

MySQL5.1版本之后binlog日志格式还支持了row,mixed ,通常使用读已提交 + row 可以实现更高的并发。对于其中的幻读、不可重复读问题在业务层做保护即可。

binlog的statement模式不适合做主从复制。比如一些函数每次执行结果会不一致。uuid()等。

隔离级别设置和查询方式:

  • 当前session设置:
set session transacton isolation level read uncommitted;
set session transacton isolation level read committed;
set session transacton isolation level repeatable read;
set session transacton isolation level serializable;
  • 查询当前隔离级别
select @@global.tx_isolation isolation;
  • 全局设置
set global transacton isolation level read uncommitted;
set global transacton isolation level read committed;
set global transacton isolation level repeatable read;
set global transacton isolation level serializable;
  • 查询全局隔离级别
select @@global.tx_isolation isolation;