欢迎光临
我们一直在努力

Repeatable-Read及Read-Committed有哪些区别

这篇文章主要为大家展示了“Repeatable-Read及Read-Committed有哪些区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“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)

以上是“Repeatable-Read及Read-Committed有哪些区别”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注云搜网行业资讯频道!

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。