前一个文章讲述了事务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
完全串行化,读操作加锁,写操作加锁,读写锁互相阻塞。这个隔离级别下,可能会造成大量的超时以及锁竞争现象。
网友评论