详解Mysql 事务隔离级别
in 技术Mysql with 0 comment

详解Mysql 事务隔离级别

in 技术Mysql with 0 comment

首先我们先了解下 Mysql的四种 隔离级别分别是什么,如下图。

QQ图片20180901145614.png

拿实验讲起:

第一步:先打开两个mysql 窗口,我们就称之为 A窗口 跟 B 窗口吧。

QQ图片20180901145450.png

准备好一张表,表结构和数据如下:

QQ图片20180901150004.png

第二步:查询当前事务隔离级别。

 show variables like '%iso%';

+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+
1 row in set, 1 warning (0.01 sec)

通过执行上面 mysql命令 会发现当前隔离级别是 可重复读。

第三步:开启事务。

在a 窗口执行 sql:

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t where id <7;
+----+
| id |
+----+
|  1 |
|  3 |
|  5 |
+----+
3 rows in set (0.00 sec)

会发现结果是 1,3,5。

然后我们打开 b 窗口 在执行如下sql:

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t values(2)
    -> ;
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.03 sec)

mysql>

我们此时 在b 窗口 有事务 向 t表 提交了一条数据, 然后我们在返回a窗口执行查询命令:

mysql> select * from t where id <7;
+----+
| id |
+----+
|  1 |
|  3 |
|  5 |
+----+
3 rows in set (0.00 sec)

会发现结果还是 1,3,5.

第四步:更改事务级别

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> set session tx_isolation='read-committed';
Query OK, 0 rows affected (0.00 sec)

此时我们将 事务级别改成了 读已提交,也就是图中的已提交读,在来看看上面的实验会变成什么样子。

第五步:继续开始试验。
在a窗口中先查询下数据:

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t where id<7;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  5 |
+----+
4 rows in set (0.00 sec)

第六步: 继续在b窗口 提交事务 插入 一条 数据。

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t values(4);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.05 sec)

mysql>

此时在返回a连接窗口 执行 之前的查询:

mysql> select * from t where id<7;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+
5 rows in set (0.00 sec)

mysql>

这时候就会发现4直接被查询出来了。但是呢,这个事务,还并没有被提交。
这就说明,在读已提交的情况下呢,我们是不可重复读的。因为在同一事务中,我们在执行两次相同的sql,出来的结果是不一样的。

而在一开始的可重复读的试验中,虽然说B窗口 同样 提交了一个事务,但是我们多次执行同一个sql的结果是一致的,这就称之为可重复读。

这就是可重复读,和已提交读 之间的差别。

Responses