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

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

在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个月,把前两个月加薪的部分也补给你了。大概就是这样的意思,总体来说,我更倾向于RC级别。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2017-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java达人

一次sql注入引发的多个mysql进程锁住的问题(针对myisam)

以前碰到过一个sql注入式攻击引发大量mysql进程被锁住的例子,现在分享给大家。当时数据表用的是myisam存储引擎。 基本知识点: InnoDB存储引擎既支...

2188
来自专栏喵了个咪的博客空间

Otter-入门篇4(单向同步实践)

Otter-入门篇4(单向同步实践)# ? 前言## 在前几节我们已经做好了关于otter的准备工作,配置好了zookeeper,manage和node,本节就...

53910
来自专栏c#开发者

Oracle 开放源代码项目

Oracle 开放源代码项目 这是无数个可扩展、使用以及构建于 Oracle 技术的开放源代码项目中的一个简短的示例。如果您有自己喜欢的开放源代码项目未在此处列...

8108
来自专栏Albert陈凯

HBase二级索引总结

在HBase中,表格的Rowkey按照字典排序,Region按照RowKey设置split point进行shard,通过这种方式实现的全局、分布式索引,成为了...

6193
来自专栏郭霖

Android数据库高手秘籍(一)——SQLite命令

要想熟练地操作任何一个数据库,最最基本的要求就是要懂SQL语言,这也是每个程序员都应该掌握的技能。虽说SQL博大精深,要想精通确实很难,但最基本的一些建表命令,...

21410
来自专栏小L的魔法馆

MySql修改WordPress密码

4006
来自专栏「3306 Pai」社区

海豚 VS 大象 功能对比

MySQL为多线程架构后台有多个线程处理内部操作例如:刷脏、Undo purge、checkpoint等,整体上MySQL分为两层Server/存储引擎。存储引...

2503
来自专栏用户2442861的专栏

linux进程监控重启shell脚本

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

1652
来自专栏cs

知识点找回2.0

Servlet(server Applet),全称Java Servlet, 是用java编写的服务器端程序。而这些Servlet都要实现Servlet的这个借...

841
来自专栏架构师之路

InnoDB,能将数据存储在DVD里?

2. alter table可以不拷贝表了,且不阻塞写操作,online DDL,酷炫吧。

981

扫码关注云+社区

领取腾讯云代金券