sql几种隔离级别的定义
模拟的时候我们需要开两个 MySQL 客户端,分别是客户端1 和客户端 2
在客户端 1 中,我们先来查看下当前会话的隔离级别,使用命令…
mysql> SHOW VARIABLES LIKE 'transaction_isolation'
mysql默认可重复读
改为read uncommited
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
因为mysql 默认是自动提交事务的,
所以需要设置autocommit=0
mysql> SET autocommit = 0;
新开一个mysql客户端2,开启一个事务,插入一个“吕布”
客户端2的设置仍然是默认的:
在客户端1中查询当前表:
发下客户端1读了客户端2还没有提交的事务数据,而客户端2也有可能立马回滚。
客户端1再次读表
用客户端1查询id=1的数据
客户端2对id=1的进行修改
这时候,客户端1再读:
对于客户端1来说,发生了不可重复读。
先用客户端1查询所有用户:
然后客户端2插入“吕布”
这时候再用客户端1查询,
发现多了一条数据,发生了幻读。
现在将客户度1的隔离级别设置为默认的不可重复读。
我们只用验证下幻读。
客户端1开启一个事务,进行查询所有英雄:
客户端2增加一个英雄赵云
此时还没有提交。 客户端1 再读(红框部分为第2次读):
说明,此时是不会发生 不可重复读 事件,换言之,是可重复读的。
我们在客户端2 中提交,
再次来到客户端1的事务中,发现仍然是读不到的。
,将客户端1的事务提交后,再次开启一个事务,进行查询可以查到。
mysql 5.7后 Repeatable-Read隔离级别通过MVCC和next-key lock来解决幻读。
同样,不可重复读也是如此