隔离级别

Posted hkhk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了隔离级别相关的知识,希望对你有一定的参考价值。

1.READ UNCOMMITED(未提交读)read uncommited

  在RERAD UNCOMMITED级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也成为脏读(Dirty Read)。这个级别会导致很多问题,从性能上说READ UNCOMMITED 不会比其他的级别好太多,但缺乏其他级别的好多好处,除非有非常必要的理由,在实际的应用中一般很少使用READ UNCOMMITED.
解释脏读:A用户修改了数据(存100块,账户为100),随后B用户又读出该数据(100),但A用户因为某些原因取消了对数据的修改(账户为0),数据恢复原值,此时B得到的数据为100就与数据库内的账户为0数据不一样

2.READ COMMITED (提交读)read commited

   大多数数据库系统的默认隔离级别都是READ COMMITED (但是mysql不是)。READ COMMITED 满足前面提到的隔离性的简单定义:一个事务开始时,只能看到已经提交的事务所做的修改。换句话说,一个事务从开始到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复的(nonerepeatable read),因为两次执行同样的查询,可能会得到不一样的结果。
   解释不可重复读:A用户读取了数据100,随后B用户读出该数据并修改(加了100),此时A用户再读取数据时发现前后两次的值不一致

3.REPEATABLE READ (可重复读)repeatable read

   REPEATABLE READ (可重复读) 解决了脏读问题。该级别保证了在同一个事务中多次读取同样的记录的结果是一致的。但是,理论上,可重复读隔离级别还是无法解决另一个幻读 (PhantomRead)的问题。所谓幻读,指的是当某个事务(用户a读数据)在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录(数据库在此范围内插入了一条数据),当之前的事务再次读 取该范围的记录时,会产生幻行(Phantom Row)。InnoDB和XtraDB 存储引擎通过多版并发控制(MVCC ,Multivesion Concurrency Control )解决了幻读问题。
  可重复读是Mysql 默认的事务隔离级别。
  

4.SERIALIZABLE(可串行化)serializable

   SERIALIZABLE是最高的隔离级别。它通过强制事务串行,避免了前面说的幻读问题。简单的来说,SERIALIZABLE会在读的每一行数据上 都加上锁,所以可能导致大量的超时和锁征用问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况,才可考虑用该级别

 

脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据

 

脏读的原因:A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作,这时候如果事务B回滚,那么A事务读到的数据是不被承认的。

 

幻读:A事务读取B事务提交的新增数据,会引发幻读问题。幻读一般发生在计算统计数据的事务中,例如银行系统在同一个事务中两次统计存款账户的总金额,在两次统计中,刚好新增了一个存款账户,存入了100,这时候两次统计的总金额不一致。注意:不可重复读和幻读的区别是:前者是指读到了已经提交的事务的更改数据(修改或删除),后者是指读到了其他已经提交事务的新增数据。

 

幻行:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

以上是关于隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

Spring 事务类型与隔离级别

如何更改mysql事务隔离级别

MySQL 是如何实现四大隔离级别的

如何查看mysql数据库隔离级别

数据库事务隔离级别 一般用哪个

MySQL的默认事务隔离级别是?