浅谈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级别。
- 从零开始写项目终极【维护网站、修复Bug】
- Redis 数据结构与内存管理策略(下)
- Redis 数据结构与内存管理策略(上)
- Servlet第三篇【request和response简介、response的常见应用】
- Java 10的10个新特性,将彻底改变你写代码的方式!
- JDK9新特性实战:简化流关闭新姿势。
- Druid数据库连接池就是这么简单
- 使用 github 做代码管理,知道这些就够了
- 二叉树就这么简单
- Elasticsearch就是这么简单
- 让 MyBatis Generator 变的更简单
- SpringMVC【参数绑定、数据回显、文件上传】
- SDNLAB技术分享(五):浅谈Open vSwitch移植
- SpringMVC【校验器、统一处理异常、RESTful、拦截器】
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- php更新cookie内容的详细方法
- php实现映射操作实例详解
- Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
- yii框架数据库关联查询操作示例
- laravel-admin的多级联动方法
- Laravel数据库读写分离配置的方法
- php给数组赋值的实例方法
- php实现分页功能的详细实例方法
- 浅谈Laravel中的三种中间件的作用
- laravel 使用auth编写登录的方法
- laravel框架 laravel-admin上传图片到oss的方法
- php实现推荐功能的简单实例
- php实现登录页面的简单实例
- Laravel 自带的Auth验证登录方法
- laravel实现上传图片的两种方式小结