浅谈MySQL中的事务隔离级别(r11笔记第86天)


之前写了一篇浅谈事务(一),算是对事务的一个基本认识,今天来简单总结一下事务的隔离级别,虽然是老掉牙的知识点,重温一下还是值得的。

在MySQ开发云主机域名L中基本有这两种事务隔离级别的设置,默认的RR(Repeatable-Read)和实际中常见的RC(Read-Committed)。两者区别是什么,怎么正确理解,用几个SQL语句就能说明白,就用简单的实验来说明白。

我们开始吧。

首先创建一个测试表test,插入一些数据

create table test( id int primary key,name varchar(30),memo varchar(30));
insert into test values(1,’name1′,’aaaa’),(2,’name2′,’aaaa’),(3,’name3′,’aaaa’),(4,’name4′,’aaaa’),(5,’name5′,’aaaa’); 很多情况下,我们会把隔离级别从默认的RR修改为RC,这也是其它很多数据库默认的事务隔离级别。

我们打开两个窗口,来对比关联测试

1

窗口1

>show variables like ‘tx_isolation’;
+—————+—————-+
| Variable_name | Value |
+—————+—————-+
| tx_isolation | READ-COMMITTED |
+—————+—————-+
1 row in set (0.01 sec)

>begin; –开启事务
>select *from test; –查看数据
+—-+——-+——+
| id | name | memo |
+—-+——-+——+
| 1 | name1 | aaaa |
| 2 | name2 | aaaa |
| 3 | name3 | aaaa |
| 4 | name4 | aaaa |
| 5 | name5 | aaaa |
+—-+——-+——+
5 rows in set (0.00 sec)

2

窗口2

begin; –开启事务
>update test set name=’aaaaa’ where id=2; –修改一条记录
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0
>commit; –提交事务
Query OK, 0 rows affected (0.01 sec)

1

窗口1

>select *from test; –查看窗口1中的数据,就会发现原来窗口的数据发生了变化,这是不可重复读的一个典型例子。
+—-+——-+——+
| id | name | memo |
+—-+——-+——+
| 1 | name1 | aaaa |
| 2 | aaaaa | aaaa |
| 3 | name3 | aaaa |
| 4 | name4 | aaaa |
| 5 | name5 | aaaa |
+—-+——-+——+
5 rows in set (0.00 sec)

再来看看RR这个隔离级别,其实有了上面的测试,就相对有底了。这是MySQL默认的隔离级别,会出现幻读的情况。

1

窗口1

首先修改隔离级别从RC到RR

>set global transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)
?查看事务隔离级别。
>show variables like ‘tx_isolation’;
+—————+—————–+
| Variable_name | Value |
+—————+—————–+
| tx_isolation | REPEATABLE-READ |
+—————+—————–+
1 row in set (0.00 sec)

>begin; –开启事务
>select *from test; –查看表test的数据。
+—-+——-+——+
| id | name | memo |
+—-+——-+——+
| 1 | name1 | aaaa |
| 2 | aaaaa | aaaa |
| 3 | name3 | aaaa |
| 4 | name4 | aaaa |
| 5 | name5 | aaaa |
+—-+——-+——+
5 rows in set (0.00 sec)

2

窗口2

>begin; –开启事务
>update test set name=’RR_test’; –修改表test的数据,所有记录都发生变化。
Query OK, 5 rows affected (0.01 sec)
Rows matched: 5 Changed: 5 Warnings: 0
>commit; –提交事务
Query OK, 0 rows affected (0.00 sec)

1

窗口1

>select *from test; –在RR模式下,窗口1中的事务因为还没有提交,看到的还是原来的数据。
+—-+——-+——+
| id | name | memo |
+—-+——-+——+
| 1 | name1 | aaaa |
| 2 | aaaaa | aaaa |
| 3 | name3 | aaaa |
| 4 | name4 | aaaa |
| 5 | name5 | aaaa |
+—-+——-+——+
5 rows in set (0.00 sec)
>commit; –我们提交窗口1的事务
Query OK, 0 rows affected (0.00 sec)
>select *from test; –再次查看数据就发生了变化,实际上窗口1中没有任何的DMl操作。
+—-+———+——+
| id | name | memo |
+—-+———+——+
| 1 | RR_test | aaaa |
| 2 | RR_test | aaaa |
| 3 | RR_test | aaaa |
| 4 | RR_test | aaaa |
| 5 | RR_test | aaaa |
+—-+———+——+
5 rows in set (0.00 sec)

小结

用一个通俗的例子来说明,比如加工资,领导叫你去谈话,然后给你加薪10%,RC的情况就是当月就立即生效;而RR的情况是,领导叫你去谈话了,结果过了两个月你看到工资还是没变,到了第3个月,把前两个月加薪的部分也补给你了。大概就是这样的意思。

相关推荐: 随笔:MySQL setup_instruments中关于部分信息不能修改

朋友告诉我如下操作不能修改我测试发现所有memory/performance_schema/* 的值都不能更改,但是其他值可以更改。。8.0.17依然如此。既然不能修改则跟一下update接口,我一共跟踪了:几个接口。查看table_setup_instrum…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/05 12:02
下一篇 06/05 12:04

相关推荐