vlambda博客
学习文章列表

MySql中事务的隔离级别

今天我们聊下MySql中事务的隔离级别。
在正式开始前,我们先得了解几个并发访问带来的问题,脏读、不可重复读、幻读。

脏读:一个事务读取到了另一个事务中尚未提交的数据。

不可重复读:一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务update时引发的问题。

幻读:一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是insert或delete时引发的问题。

上面的描述有点抽象,读完大概知道个意思,具体咋回事,咱得做实验,上点图。(以下测试均在read uncommitted隔离级别下进行,要么测不出来,啥是read uncommitted,后面会说)。

首先我们准备点数据。张三李四一人1000;

脏读:接下来我们使用窗口1开启事务,给张三减500,事务不提交,窗口2 来读。结果读到了窗口1中事务未提交的数据。如下图(看不清你就放大了拉)

MySql中事务的隔离级别

这个就是脏读。如果后面程序出问题,事务回滚,这个数据就是错的,危害很大。

不可重复读:我们先把数据还原,每人1000。

MySql中事务的隔离级别

接着,看图吧。都在图里。

MySql中事务的隔离级别

这个就是不可重复读,一个事务中两次读取的数据内容不一致,即使两次数据你觉得他都是正确的,但在窗口2中的事务中,两个数据不一致,产生了歧义也是不允许的。

        幻读:mysql中无法看到幻读效果。(我们最后通过其他方式展示)。


ok,说完了这三种并发访问带来的问题。我们说下事务的隔离级别。

    

MySql中事务的隔离级别

mysql有这四种隔离级别,从上到下,越来越高,越来越严格。

--设置隔离级别(设置完退出mysql重新登录生效)set global transaction isolation level 级别字符串;--查看隔离级别show variables like '%isolation%';

MySql中事务的隔离级别

MySql中事务的隔离级别


上面演示并发访问的三个问题时,我设置的就是第一种read uncommitted。

当我们设置了对应的隔离级别后,就能解决对应的问题。这里就不一一演示了。


最后我们看下幻读。mysql中无法看到幻读效果,我们把隔离级别设置成最高级别,看下mysql在最高隔离级别下是怎样阻止幻读的。

首先隔离级别调成serializable

set global transaction isolation level serializable;

MySql中事务的隔离级别

然后我们进行下面操作

1、窗口1开启事务

2、查询表中记录数

3、得到结果

4、窗口2开启事务

5、插入数据(此时会卡在这里,不执行)

如下图:

接下来我们继续

6、窗口1提交事务

7、窗口2中卡主的insert语句自动执行了。

如下图:


这次事务的隔离级别就先了解到这里,后面我们找时间探究下什么情况下应该选择什么隔离级别,是隔离级别越高越好吗?下次说。