Mysql 四种 隔离级别学习(四)

上节我们学习了Repeatable Read可重读,在这种隔别级别下,可能会出现幻读 (Phantom Read),但是InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题,这一节,我们继续学习四种隔防级别中另一种Serializable(可串行化)。

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:

脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:

f25d1672d12.jpeg

现在我们来举个例子说明一下Serializable(可串行化)会出现的问题:

首页在客户端A我们把自动提交事务关闭,然后把隔离级别设置成 Repeatable,并开启了一个事务,如下图:

QQ截图1.png

这时,如果有客户端B也把自动提交事务关闭,然后把隔离级别设置成Repeatable(说明:我这里是测试,所以设置的当前会话的隔离,如果正式环境下,一般都是在配置文件里把Mysql的隔离级别设置好的。如果那样的话,客户端B就不要再设置级别了,因为默认就是和A一样的),然后也开启了一个事务,并插入一条数据,但是,我们发现,插入数据失败,如下图:

QQ截图2.png

通过上面测试我们知道,serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止 。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。

到此我们四种隔离级别都测试过了,如果文章中有错误或不明白的,希望留言指出或提问,以免会误导其它朋友。谢谢!

未经允许不得转载:易读小屋  »  Mysql 四种 隔离级别学习(四)