MySQL数据库之事务隔离级别

隔离级别

引言:
在数据库操作中,隔离性是一种很重要的特性,涉及到并发处理。在SQL标准中,一共是有四种隔离级别的,越低的隔离级别通常也可以做到更高的并发处理,系统对其进行开销也更小。

一、READ UNCOMMITTED(未提交读)

在这种级别之中,事务的修改,即便是没有提交,也是对其他的事务是可见的。事务可以读取没有提交的数据,这也是脏读,因为事务没有提交,但可以读取到,这会产生脏数据。从性能上说,READ UNCOMMITED 不会比其他的级别好很多,但是却缺少了别的级别的很多的好处,所以说,一般实际应用,不采用这种级别。

\color{#FF0000}{缺点:} 造成脏读等一系列的问题。
\color{#FF0000}{优点:} 性能稍微好一点。

二、READ COMMITED(提交读)

大多数的数据库系统的默认隔离级别都是该级别,but我们的MySQL并非是该级别。 READ COMMITTED满足前面提到的隔离性的简单定义,即一个事务开始的时候,只能够“看见”已经提交过得事务所做的修改,也就是一个事务在提交前,所对数据做的任何修改都是对其他事务不可见的。但是在该级别中,仍会产生一个问题,即两次执行同样的查询,结果可能不一样。故又称为不可重复读。

两次执行同样查询,结果不一样原因:可以理解为:两次查询为一个事务,讲该事务的处理拉长,在此事务处理的中间,仍然有其他的事务进行修改数据,并且提交了,这个时候,在这个事务中,虽然两次查询是一样的,但是查询到的结果集不一样。
\color{#FF0000}{即我在事务中读的时候,别人插进来进行操作数据。}

\color{#FF0000}{缺点:} 虽然不会脏读,但是却存在不可重复读的问题。
\color{#FF0000}{优点:} 解决了脏读的问题。

三、REPEATABLE READ(可重复读)

该级别即解决了脏读问题,也解决了不可重复读问题,且该级别是MySQL数据库的默认事务隔离级别。

我在事务操作的时候,不允许别的事务对我要操作的数据进行操作,这样子,即便对数据进行多次查询操作,也不会产生不可重复读的问题。

但是会产生一个幻读问题,即某一个事务在读取一个范围内的记录的时候,另外的事务在该范围内插入新的数据,那么当之前的数据再次读取该范围的记录的时候,会发现后一次查询看到前一次查询没有看见的行。这行如同幻觉一样产生。

在InnoDB和XtraDB存储引擎中,通过多版本并发控制(MVCC)解决幻读问题,有机会再讲。

\color{#FF0000}{缺点:} 会出现幻读。
\color{#FF0000}{优点:} 解决了脏读,不可重复读的问题。

四、SERIALIZABLE(可串行化)

事务中最高的隔离级别,通过强行将事务串行执行,避免产生幻读的问题,简单来说,SERIALIZABLE会在读取的每一行的数据的时候都加上锁,也就是说,我在执行事务的时候,你连看的机会都没有,在这个事务没有操作完成,别的事务只能等待操作完成。

在实际应用之中,很少采用,除非非常需要确保数据的一致性,而且得接收没有并发,才会考虑该级别。

\color{#FF0000}{缺点:} 不能并发,容易导致大量的超时和锁争用的问题,容易死锁。
\color{#FF0000}{优点:} 解决上述问题。

五、各数据库默认处理级别

MySQL:REPEATABLE READ
SQL SERVER:READ COMMITTED
Oracle:READ COMMITTED

如有错误,望指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章