首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《sql必知必会》——读书笔记(4)

模拟mysql 几种隔离级别

sql几种隔离级别的定义

准备数据库和数据表

模拟的时候我们需要开两个 MySQL 客户端,分别是客户端1 和客户端 2

在客户端 1 中,我们先来查看下当前会话的隔离级别,使用命令…

代码语言:javascript
复制
mysql> SHOW VARIABLES LIKE 'transaction_isolation'

mysql默认可重复读

改为read uncommited

代码语言:javascript
复制
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

因为mysql 默认是自动提交事务的,

所以需要设置autocommit=0

代码语言:javascript
复制
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来解决幻读。

同样,不可重复读也是如此

下一篇
举报
领券