数据库技术专题

MySQL隔离级别

2017-03-16  本文已影响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

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

上一篇 下一篇

猜你喜欢

热点阅读