文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Repeatable-Read及Read-Committed区别

2021-11-04 00:22

关注

Repeatable-Read及Read-Committed区别

mysql 默认提供的是 Repeatable-Read 可重复读,更适用于oltp
Read-Committed 不可重复读 也可以叫做提交读
在MySQL中基本有这两种事务隔离级别的设置,默认的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,这也是其它很多数据库默认的事务隔离级别。

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


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模式下的测试

再来看看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)

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯