美文网首页
mysql默认隔离级别为什么是可重复读?

mysql默认隔离级别为什么是可重复读?

作者: Raral | 来源:发表于2022-11-04 16:42 被阅读0次

    mysql默认隔离级别为什么是可重复读

    [图片上传失败...(image-4b684e-1667551259926)]
    1 主服务器上面的任何操作都会通过自己的 I/O tread(I/O 线程)保存在二进制日志 Binary log 里面。

    2 从服务器上面也启动一个 I/O thread,通过配置好的用户名和密码, 连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。

    3 从服务器上面同时开启一个 SQL thread 定时检查 Realy log(这个文件也是二进制的),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。(链接:https://www.jianshu.com/p/faf0127f1cb2

    当mysql隔离级别为“读提交”时

    [图片上传失败...(image-489130-1667551259926)]
    根据图上步骤:

    1. 先提交session2的新增操作sql,再提交session1:删除操作
    2. 由于隔离级别为 读已提交的,表示当提交后才写入日志
    3. 所以日志文件 sql顺序: 新增sql 删除sql;导致从库去执行日志sql文件时,没有数据

    mysql5.1的binlog又提供了两种格式row、和fixed。mysql会根据情况择优选择使用哪种格式。就算是这样也不能避免主从不一致的问题。就像前面的例子如果删除大量数据的时候保存binlog日志采用statement格式,未提交;插入大量数据的时候也采用了statement。(为什么采用statement格式,可看推荐文章《mysql主服务器 binlog_format 的 statement,row, mixed 三种格式对比。》),那么就可能造成主从不一致的问题。只有将修改的语句串行化才能解决这个问题。将隔离级别提升为可重复读就能将写入binlog的语句串行化。从库是根据binlog日志执行了的。binlog保证了与主库相同的执行顺序,那么也就保证了主从的一致性。

    当mysql默认隔离级别为可重复读时

    [图片上传失败...(image-9d6bb1-1667551259926)]
    离级别设为可重复读(Repeatable Read),在该隔离级别下引入间隙锁。当Session 1执行delete语句时,会锁住间隙。那么,Ssession 2执行插入语句就会阻塞住,无法继续执行。只有到session1 提交(commit)了之后。才能执行。实现了写入binlog的语句串行化。解决了主从不一致的问题。

    总结

    MySQL使用可重复读来作为默认隔离级别的主要原因是语句级的Binlog。可重复读能提供SQL语句的写可串行化,保证了主从一致。

    相关文章

      网友评论

          本文标题:mysql默认隔离级别为什么是可重复读?

          本文链接:https://www.haomeiwen.com/subject/gncutdtx.html