334 字
2 分钟
未命名

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

MySQL的默认的隔离级别是RR,也就是可重复读级别。选择这个级别主要是因为历史遗留问题,一开始binlog的格式是statement格式,也就是记录sql语句,但是这个会导致很多问题,在读已提交隔离级别下,并发事务的提交顺序和语句实际执行顺序可能不一样,这时候就会导致出错,主从的数据对不上。而设为RR,在事务A执行操作时会有间隙锁阻止其他并发事务执行插入等操作,直到事务A提交,就强行保证了执行顺序和提交顺序,而现在binlog使用的是记录实际物理行变化的方式,只有实际变化才会记录下来,读已提交就没有之前那个问题了。而由于兼容性等原因,MySQL没有修改默认的事务隔离级别,所以还是RR。

问题#

把隔离级别从可重复读改成读已提交,需要做什么配置?#

修改transcation_isolation参数,可以使用SET GLOBAL动态改。然后把binlog_format改成row(新版的默认就是row),然后重启让所有连接都生效。