数据库的隔离级别

在介绍数据库的隔离级别之前,先来看一下如果没有事务隔离的情况下会发生什么?

  • 脏读:脏读意味着一个事务在读数据库的时候,读到了另一个还没有提交的修改,如果另一个事务进行了回滚,那么也就读到了脏数据,也就是所谓的脏读。
  • 不可重复读:不可重复读是指在一个事务范围里进行多次查询,得到的结果不同,和脏读的区别在于,一个是读到了已经提交的事务,一个是读到了还未提交的事务。
  • 幻读(虚读): 幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

现在来看看MySQL数据库为我们提供的四种隔离级别
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

在MySQL数据库中查看当前事务的隔离级别:

select@@tx_isolation;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 事务 事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功的对数据库应用改组查询的全部...
    zycisbg阅读 698评论 1 5
  • 数据库的四大特性 原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。 一致性...
    Crazy_MC阅读 289评论 0 1
  • 参考文章:数据库村的旺财和小强 一.数据库中并发一致性问题 1.1修改丢失 一个事务对数据的修改,在还没写会该数据...
    第四单元阅读 308评论 0 1
  • 一、事务 1、事务四要素:ACID 对于事务,我之前的理解是很粗糙的,不就是为了保证操作的原子性么?一般订单系统或...
    张伟科阅读 1,365评论 0 5
  • 秋姑娘轻轻地走了,调皮的冬弟弟却又带着可爱的精灵悄悄的来了。 这两天,这小精灵悄悄的降临了人间。它纯洁的没有...
    奔跑的无名阅读 145评论 0 3