浅谈MySQL中的事务隔离级别
发布时间:2022-04-06 10:57:22 所属栏目:MySql教程 来源:互联网
导读:之前写了一篇浅谈事务(一),算是对事务的一个基本认识,今天来简单总结一下事务的隔离级别,虽然是老掉牙的知识点,重温一下还是值得的。 在MySQL中基本有这两种事务隔离级别的设置,默认的RR(Repeatable-Read)和实际中常见的RC(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) 小结 用一个通俗的例子来说明,比如加工资,领导叫你去谈话,然后给你加薪10%,RC的情况就是当月就立即生效;而RR的情况是,领导叫你去谈话了,结果过了两个月你看到工资还是没变,到了第3个月,把前两个月加薪的部分也补给你了。大概就是这样的意思。 (编辑:临夏站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐