mysql数据库隔离级别详解


Posted in MySQL onJune 16, 2022

隔离级别

一、mysql有四个事务隔离级别

每个级别都有字符或数字编号

  1. 读未提交 READ UNCOMMITTED | 0 : 存在脏读,不可重复度,幻读的问题。 
  2. 读已提交 READ COMMITTED | 1 : 解决脏读问题,存在不可重复读,幻读的问题。
  3. 可重复读 REPEATABLE READ | 2 : 解决脏读,不可重复读的问题,存在幻读,默认隔离级别,使用MVCC机制实现可重复读。
  4. 序列化 SERIALIZABLE | 3 : 解决脏读,不可重复读,幻读,可保证事务安全,但完全串行执行,性能最低。

我有记忆方法,先是RU、RC, 记住UC顺序,联想到UC WEB。

二、为什么默认RR隔离级别?

RR级别作为mysql事务默认隔离级别,是事务完全和性能的折中。SERIALIZABLE级别是悲观地认为幻读时刻都会发生,故会自动地隐式地对事务所需资源加排他锁,其他事务访问此资源会被阻塞等待,故事务是安全的,但需要认值考虑性能。

三、RR隔离级别下手动加锁解决幻读理论基础

InnoDB的行锁锁定的是索引,而不是记录本身。索引映射的记录存在就加行锁,如果不存在则会加next-key lock/gap锁/间隙锁, 故InnoDB可以实现事务对某记录的预先占用。

脏读、不可重复读、幻读 及其解决方法

脏读

  • 一个事务读取到另一个事务还没有提交的数据。解决方法:把事务隔离级别调整到READ COMMITTED。

不可重复读

  • 一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。解决方法:把事务隔离级别调整到REPEATABLE READ。

幻读

  • 网上很多文章都说一个事务执行范围查询,两次select得到的条数不同,就叫幻读,这是错误的!!!
  • 幻读并不是说两次读取获取的结果集不同,幻读是指某一次select操作得到的结果所表征的数据状态无法支持后续的业务操作,具体例子:select某记录是否存在,不存在,准备插入此记录,但执行insert时发现此记录已存在,无法插入,此时就发生了幻读。
  • 还一种理解思路,就是因为先采用了"快照读",然后又用了"当前读",发现结果不同。比如先select是快照读,然后update、insert等,这时会用到当前读,发现操作出现未预料结果。

幻读解决方法

1、把事务隔离级别调整到SERIALIZABLE。2、RR隔离级别下,对select操作手动加行锁,select ... for update,这也序列化隔离级别下隐式会做的事。

参考文章

幻读  https://segmentfault.com/a/1190000016566788

事务隔离级别命令行操作

1、查看隔离级别

1)查看当前会话隔离级别

mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)

2)查看系统隔离级别

mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| READ-UNCOMMITTED      |
+-----------------------+
1 row in set, 1 warning (0.00 sec)

2、设置隔离级别

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

1)设置当前会话

mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)

2)设置系统

mysql> set global transaction isolation  level read uncommitted;                
Query OK, 0 rows affected (0.00 sec)3、命令行,开始事务时用

操作验证

自己在命令行去验证几种隔离级别下的读问题。

一、实现脏读

在不可提交读, 也就是READ UNCOMMITED情况下,会产生脏读。

mysql数据库隔离级别详解

二、操作验证--实现不可重复读

在可提交读, 也就是READ COMMITED情况下,会产生不可重复读。

mysql数据库隔离级别详解

三、操作验证--解决不可重复读

repeatable read(MySQL默认隔离级别),这时候能解决可重复读。

右边事务提交了,修改了age=29,左边再次查询,还是28。

mysql数据库隔离级别详解

四、操作验证--实现幻读

repeatable read(MySQL默认隔离级别),这时候还会出现幻读。

mysql数据库隔离级别详解

总结

到此这篇关于mysql数据库隔离级别文章就介绍到这了,更多相关mysql隔离级别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
mysql字符串截取函数小结
Apr 05 MySQL
详解MySQL集群搭建
May 26 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
MySQL数据库索引的最左匹配原则
Nov 20 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
Mysql 如何合理地统计一个数据库里的所有表的数据量
Apr 18 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
MySQL聚簇索引和非聚簇索引的区别详情
Jun 14 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 MySQL
面试官问我Mysql的存储引擎了解多少
Aug 05 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
Sep 23 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 #MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 #MySQL
MySQL数据库之存储过程 procedure
Jun 16 #MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 #MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 #MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 #MySQL
MySQL慢查询中的commit慢和binlog中慢事务的区别
Jun 16 #MySQL
You might like
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
php线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
javascript实现图片上传前台页面
2015/08/18 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
Django实现的自定义访问日志模块示例
2017/06/23 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
某公司.Net方向面试题
2014/04/24 面试题
护士自我鉴定
2013/10/23 职场文书
初中英语演讲稿
2014/04/29 职场文书
镇政府副镇长群众路线专题民主生活会对照检查材料
2014/09/19 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android