MySQL隔离级别

作者: 丁木木木木木 | 来源:发表于2017-03-16 22:24 被阅读101次

    前一个文章讲述了事务ACID的特性以及并发事务造成的数据不一致性问题,事务ACID以及不一致性问题,接下来讲解下MySQL中隔离级别。

    MySQL隔离级别

    因为上述的几个数据不一致性问题,MySQL主要提供了四个隔离级别来解决这些问题,用一个表格来描述各个隔离级别解决的以及还存在的不一致问题。
    (☑️表示还是有这种现象,✖️表示不会出现这个问题)

    隔离级别 脏读 不可重复读 幻读
    读未提交 ☑️ ☑️ ☑️
    读已提交 ✖️ ☑️ ☑️
    可重复读 ✖️ ✖️ ☑️
    串行化 ✖️ ✖️ ✖️

    串行化的隔离级别最高,读未提交的隔离级别最低。隔离级别越高,说明事务的并发度越低,当然执行效率也越低。接下来具体讲解下这几个隔离级别,应用中根据实际情况来选择隔离级别,MySQL默认隔离级别为可重复读,可以通过以下命令查看系统级、会话级的默认隔离级别。

    mysql查看默认隔离级别.png

    讲隔离级别之前,先说下共享锁(读锁)和排他锁(写锁)。
    读锁S:若事务T对数据对象A加了读锁,其他事务可以对数据A再加读锁,但不能加写锁,直到释放了数据A上的读锁。
    写锁X:若事务T对数据对象A加了写锁,则只有事务T可以对数据A进行读取和修改,其他事务只能等T事务释放了数据的写锁才可以对数据A进行操作。

    读未提交Read uncommitted

    该隔离级别下,所有事务都可以读取到其他事务没有提交的处理结果。很少用于实际应用,因为不能保证数据的一致性。

    读已提交Read committed

    大多数数据库采用的默认隔离级别,如Oracle。读已提交隔离级别下,读取不加锁,写加锁,即数据的删除、修改及写入都需要加锁,使得事务只能看到其他事务已经提交的数据,避免了脏读。

    可重复读Repeated read

    解决脏读和不可重复读的数据不一致性问题,保证同一事务的多个实例访问数据时,读到的结果是一致的。

    串行化Serializable

    完全串行化,读操作加锁,写操作加锁,读写锁互相阻塞。这个隔离级别下,可能会造成大量的超时以及锁竞争现象。

    相关文章

      网友评论

        本文标题:MySQL隔离级别

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