加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Repeatable-Read及Read-Committed有哪几点不一样

发布时间:2023-10-23 12:53:19 所属栏目:MySql教程 来源:
导读:这篇文章主要为大家展示了“Repeatable-Read及Read-Committed有哪些区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Repeatable-Read及Read-Comm

这篇文章主要为大家展示了“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

>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

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

>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

首先修改隔离级别从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

>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

>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有哪些区别”这篇文章的所有内容,感谢各位的阅读!

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章