SQL标准是如何规定事务级别的?

前言

通过上一篇张,我们了解到并发事务,带来的脏读、脏写、不可重复读和幻读几种问题。针对这系列问题,实际上SQL标准上已经规定了事务的几种隔离级别,以解决上述问题。

这次就来看看分别是sql标准上的是哪几种隔离级别,需要特别注意到是,sql标准的隔离级别与MySQL具体实现的隔离级别是有差距的。

1. read uncommitted

第一种隔离级别是未提交读。

未提交读不会出现脏写,在这种隔离级别下,是不允许多个事务在未提交的情况下同时更新同一行数据的。但是有可能导致脏读、不可重复读和幻读。

原因是在事务未提交时多次去查询同一行数据,有可能发生读到的数据不一样,毕竟其他事务未提交的情况下是有可能发生回滚的,更别说不可重复读和幻读了。

2. read committed

第二种隔离级别是已提交读,简称RC。

已提交读不会出现脏写和脏读。在这种隔离级别下,未提交的事务修改的数据,是不允许被访问的,即是说,未提交的事务修改的数据,是绝对读不到的。但仍有可能出现不可重复读和幻读。

原因是事务一旦修改了数据并提交了,其他事务还是会读到。可能导致每次读到的数据不一致,而出现不可重复读和幻读等问题。

3. repeatable read

第三种隔离级别是可重复读,简称RR

可重复读隔离级别下,还是会出现幻读。在这种隔离级别下,一个事务查询到了一个值,后面的事务再去修改这个值并不会影响到第一个事务查询到的值,即是说,第一个事务查询到的值为A,第二个事务去把A改成了B并提交了,第一个事务再次去查询的时候,依然会返回A值。

但是,有可能遇到其他事务插入数据的情况,这时,假设执行“select * from table where id >10”,第一个事务查询到了10条数据,第二个事务插入了一条id>10的数据并提交了,这时第一个事务再去查询就会查询到11条数据,这种情况下就导致了幻读的问题。

4. serializeble

第四种隔离级别是序列化。

serializeble隔离级别不允许多个事务并发执行,只能串行起来执行。即是说,首先执行事务A提交后,然后执行事务B提交后,再执行事务C提交。效率非常非常的低。

你可能感兴趣的:(SQL标准是如何规定事务级别的?)