美文网首页
数据库隔离级别

数据库隔离级别

作者: Tomy_Jx_Li | 来源:发表于2018-12-26 21:29 被阅读7次

    最近回过头来,发现以前的一些基础性的东西记忆不是很深了,在此重新梳理下。同时这里只是简单的记录,并没有深入的分析,因为任何一个东西都够一长篇文章的。后期有时间了可以重新写下。

    数据库的事务四大特性,还有传说中的脏读、不可重复读、幻读

    ACID,这个网上有很多资料不一一细说。比如这一篇就很不错。
    事务的四大特性是如何保证的呢?
    原子性通过undolog保证
    一致性通过redolog保证
    持久性通过redolog保证
    隔离性通过锁机制保证
    再说下自己对脏读、不可重复读、幻读的理解。
    这里的理解都是以A事务为主事务,B事务为干扰事务来说明。

    • 脏读:A事务开启了事务,进行查询,这时候B事务也开启事务,进行了更新操作,但是未提交。A事务重新查了一次可以查到。总之:A事务读到了B事务未提交的数据。
    • 不可重复读:A事务读一条或者多条记录,B事务修改了这些记录,同时提交。A事务再次查看数据不同了。总之,A事务读到了B事务提交的更新记录。
    • 幻读:A事务读某个表的数据,比如大于1的有2条,但是呢B事务提交了一条记录,值为3。A再次读取多出来一条记录了。总之:A事务读到了B事务提交的插入删除记录。

    数据库的隔离级别

    • Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
    • Repeatable read (可重复读):可避免脏读、不可重复读的发生。
    • Read committed (读已提交):可避免脏读的发生。
    • Read uncommitted (读未提交):最低级别,任何情况都无法保证。

    mysql的事务隔离级别

    环境:mysql 5.7.24,引擎:innodb
    这里主要测试了rr和rc以及ru三种。
    rr下测试结果是:除了不会发生脏读、不可重复读以为。也不会发生幻读。具体原因下面分析。
    rc下的结果:幻读出现、不可重复读出现。脏读未出现。
    ru下的结果:都出现

    所以mysql数据库下的rr类比于序列化。这里用了‘类比于’是因为rr下的读是基于mvcc(多版本并发控制机制),也就是一致性读。并不是真正的序列化,且要在rr隔离级别,同事innodb引擎下。而mvcc的实现是基于undolog的。可以查看这里了解MVCC。如果想进一步去了解可以多看看网上的一些资料。

    相关文章

      网友评论

          本文标题:数据库隔离级别

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