MySql中事务的隔离级别
脏读:一个事务读取到了另一个事务中尚未提交的数据。
不可重复读:一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务update时引发的问题。
幻读:一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是insert或delete时引发的问题。
上面的描述有点抽象,读完大概知道个意思,具体咋回事,咱得做实验,上点图。(以下测试均在read uncommitted隔离级别下进行,要么测不出来,啥是read uncommitted,后面会说)。
首先我们准备点数据。张三李四一人1000;
这个就是脏读。如果后面程序出问题,事务回滚,这个数据就是错的,危害很大。
接着,看图吧。都在图里。
这个就是不可重复读,一个事务中两次读取的数据内容不一致,即使两次数据你觉得他都是正确的,但在窗口2中的事务中,两个数据不一致,产生了歧义也是不允许的。
幻读:mysql中无法看到幻读效果。(我们最后通过其他方式展示)。
mysql有这四种隔离级别,从上到下,越来越高,越来越严格。
--设置隔离级别(设置完退出mysql重新登录生效)
set global transaction isolation level 级别字符串;
--查看隔离级别
show variables like '%isolation%';
上面演示并发访问的三个问题时,我设置的就是第一种read uncommitted。
当我们设置了对应的隔离级别后,就能解决对应的问题。这里就不一一演示了。
最后我们看下幻读。mysql中无法看到幻读效果,我们把隔离级别设置成最高级别,看下mysql在最高隔离级别下是怎样阻止幻读的。
首先隔离级别调成serializable
set global transaction isolation level serializable;
然后我们进行下面操作
1、窗口1开启事务
2、查询表中记录数
3、得到结果
4、窗口2开启事务
5、插入数据(此时会卡在这里,不执行)
如下图:
接下来我们继续
6、窗口1提交事务
7、窗口2中卡主的insert语句自动执行了。
如下图: