美文网首页
003-Mysql公司使用隔离级别是什么

003-Mysql公司使用隔离级别是什么

作者: 糖纸疯了 | 来源:发表于2021-12-22 09:15 被阅读0次

    1. Mysql公司使用隔离级别是什么

    为什么这么选择?为什么不适用RR?为什么Mysql默认使用RR?


    2. 参考网址:


    3.总结:

    id color age gender
    1 Red 39 M
    2 White 25 M
    5 Red 18 F
    7 White 18 M

    缘由一:在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多!

    此时执行语句

    select * from test where id <3 for update;
    

    在RR隔离级别下,存在间隙锁,可以锁住(2,5)这个间隙,防止其他事务插入数据!
    而在RC隔离级别下,不存在间隙锁,其他事务是可以插入数据!

    ps:在RC隔离级别下并不是不会出现死锁,只是出现几率比RR低而已!


    缘由二:在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行

    此时执行语句

    update test set color = 'blue' where color = 'red'; 
    

    在RC隔离级别下,其先走聚簇索引,进行全部扫描。加锁如下:


    image

    但在实际中,MySQL做了优化,在MySQL Server过滤条件,发现不满足后,会调用unlock_row方法,把不满足条件的记录放锁。
    实际加锁如下


    image

    然而,在RR隔离级别下,走聚簇索引,进行全部扫描,最后会将整个表锁上,如下所示


    image

    缘由三:在RC隔离级别下,半一致性读(semi-consistent)特性增加了update操作的并发性!

    在5.1.15的时候,innodb引入了一个概念叫做“semi-consistent”,减少了更新同一行记录时的冲突,减少锁等待。
    所谓半一致性读就是,一个update语句,如果读到一行已经加锁的记录,此时InnoDB返回记录最近提交的版本,由MySQL上层判断此版本是否满足update的where条件。若满足(需要更新),则MySQL会重新发起一次读操作,此时会读取行的最新版本(并加锁)!
    具体表现如下:
    此时有两个Session,Session1和Session2!
    Session1执行

    update test set color = 'blue' where color = 'red'; 
    

    先不Commit事务!
    与此同时Ssession2执行

    update test set color = 'blue' where color = 'white'; 
    

    session 2尝试加锁的时候,发现行上已经存在锁,InnoDB会开启semi-consistent read,返回最新的committed版本(1,red),(2,white),(5,red),(7,white)。MySQL会重新发起一次读操作,此时会读取行的最新版本(并加锁)!
    而在RR隔离级别下,Session2只能等待【RR在非主键上查询把表锁住了】!


    4.两个疑问

    4.1、在RC级别下,不可重复读问题需要解决么?

    不用解决,这个问题是可以接受的!毕竟你数据都已经提交了,读出来本身就没有太大问题!Oracle的默认隔离级别就是RC,你们改过Oracle的默认隔离级别么?


    4.2、在RC级别下,主从复制应该用什么binlog格式?

    OK,在该隔离级别下,用的binlog为row(mixed)格式,是基于行的复制!Innodb的创始人也是建议binlog使用该格式!

    相关文章

      网友评论

          本文标题:003-Mysql公司使用隔离级别是什么

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