前言
通过上一篇张,我们了解到并发事务,带来的脏读、脏写、不可重复读和幻读几种问题。针对这系列问题,实际上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提交。效率非常非常的低。