美文网首页
mysql事务隔离级别及MVCC多版本并发控制机制

mysql事务隔离级别及MVCC多版本并发控制机制

作者: 吕艳凯 | 来源:发表于2020-04-06 11:16 被阅读0次

    四种隔离级别

    SQL标准中定义了四种隔离级别,按由松到紧的顺序:

    <1>未提交读

    A事务内的修改还未提交时,其他事务就可以读取A事务内未提交的数据,这部
    分数据是脏数据,因此会导致脏读的问题。

    <2>提交读(不可重复读)

    A事务提交后,其他事务才可以读取该事务提交后的数据,解决了脏读的问题。
    但是如果被A事务修改了,那么其他事务读物该条数据时,在A事务提交前和提交后读取的数据是不⼀样的,因此也叫不可
    重复读。

    <3>可重复读(MySQL的默认事务隔离级别)

    不仅解决了脏读的问题,也解决了不可重复读的问题
    在A事务提交前后,其他事务读取A事务修改的数据时是完全⼀致的,因此叫可重复读。
    幻读问题
    如果A事务修改的不是某⼀条数据,⽽是⼀整段范围数据
    在A事务修改的⼀段范围数据中插⼊了新的数据,那么A事务读取这段范围数据前后会产⽣不⼀致既幻⾏问题。
    问题解决方案:
    InnoDB和XtraDB引擎通过MVCC(多版本并发控制)解决了幻读的问题。
    InnoDB通过间隙锁,不仅锁定⾏数据,还对⾏数据间的间隙进⾏锁定,防⽌幻
    影⾏的插⼊。

    <4>可串⾏化

    最⾼的隔离级别,通过强制事务串⾏执⾏的⽅式,把读取的每⼀⾏数据都上锁,
    避免了幻⾏的问题。但是要求事务必须依次执⾏,不⽀持事务并发执⾏。

    MVCC多版本并发控制机制:

    基于提⾼不同事物同时执⾏的并发性能考虑,MVCC是⾏级锁的变种,在很多情况下避免了加锁的操作,因此开销更低。
    InnoDB的MVCC运⾏机制:
    每⼀⾏数据后⾯有2个隐藏的列,⼀个保存了该⾏创建时的系统版本号,另⼀列
    保存了改⾏删除时的系统版本号,每⼀个事务开始前,系统版本号都会⾃增,事
    务开始时刻的系统版本号就是该事务的版本号。
    select操作:只查找⾏创建版本号⼩于或等于该事务系统版本号的数据,⼩于的
    是本事务之前就存在的数据,等于的是本事务插⼊的数据。
    insert操作:新插⼊的⾏数据的创建版本号就是本事务的系统版本号
    delete操作:删除的⾏数据的删除版本号就是本事务的系统版本号
    update操作:先增后删,先插⼊⼀条新数据,⾏创建版本号是本次事物的系统版
    本号,再把原来的数据删除,也就是在原来数据的⾏后的删除标识列加上本次事
    物的系统版本号

    相关文章

      网友评论

          本文标题:mysql事务隔离级别及MVCC多版本并发控制机制

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