Mysql Innodb事务隔离级别理解
本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Mysql Innodb事务隔离级别理解》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~
Mysql的事务隔离级别有四种,如下:
1.Read Uncommitted 它允许读取其它事务改变但未提交的脏数据,同样会导致不可重复读和幻读问题.
2.Read Committed 可避免读取脏数据,依然会导致不可重复读和幻读问题.
3.REPEATABLE-READ Mysql默认隔离级别,会导致幻读.但mysql此级别采用MVCC一致性读,也不会产生幻读
4.Serializable 最高隔离级别,会避免出现上面的问题.
可用以下方法查看当前系统的隔离级别
mysql> select @@global.tx_isolation,@@tx_isolation; +-----------------------+-----------------+ | @@global.tx_isolation | @@tx_isolation | +-----------------------+-----------------+ | REPEATABLE-READ | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec)
未提交读READ-UNCOMMITTED 脏读、不可重复读示例:
#session A mysql> set session transaction isolation level read uncommitted; #设置隔离级别为未提交读 Query OK, 0 rows affected (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from inno_tbl where id=2; +----+------+ | id | name | +----+------+ | 2 | John | +----+------+ 1 row in set (0.00 sec)
#session B mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> update inno_tbl set name='Jack Ma' where id=2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
#session A mysql> select * from inno_tbl where id=2; +----+---------+ | id | name | +----+---------+ | 2 | Jack Ma | +----+---------+ 1 row in set (0.00 sec)
此时session A读取到了session B修改但未提交的数据,若此时session B回滚,则A读取到的数据便是无效的,这便是“脏数据”,由于A第一次读取到的数据与第二次读取到的数据不同,这便是“不可重复读”;同理,或在B中插入新数据,A中此事务中也会读取的新的数据行,这便是幻读。
同样的流程,将A的隔离级别改为read committed,则不会产生“脏读”,但同样会产生“不可重复读”和“幻读”
默认隔离级别REPEATABLE-READ下:
#session A mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from inno_tbl where id=2; +----+--------------+ | id | name | +----+--------------+ | 2 | John | +----+--------------+ 1 row in set (0.00 sec)
#session B mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> update inno_tbl set name='Lucy' where id=2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> commit; Query OK, 0 rows affected (0.03 sec)
#session A mysql> select * from inno_tbl where id=2; +----+--------------+ | id | name | +----+--------------+ | 2 | John | +----+--------------+ 1 row in set (0.00 sec) #注意,此时没有产生“不可重复读”问题,但若是为查询加上共享锁: mysql> select * from inno_tbl1 where id=2 lock in share mode; +----+---------+ | id | name | +----+---------+ | 2 | Lucy | +----+---------+ 1 row in set (0.00 sec)
说明:会话A中的事务读取到id为2的inno_tbl表中的name字段为John,而如果此时会话B中的事务将inno_tbl中id为2的name改为Lucy并提交,若些时A中的事务再读取此行数据时,会发现,如果直接使用select方式查询,读出的数据依然是旧的数据,而加上共享锁,会读出真正的数据.Why?因为在innodb引擎中,mysql的增删改查语句可以分为两种,一种是快照读,一种是当前读,只有普通的查询语句为快照读,而剩余的增删改和加上lock in share mode共享锁或加上for update排它锁的查询语句,都属于当前读;当时读读取的是最新的数据,而快照读读取的不一定是最新的数据.由此可推出:当在session A中以条件为name=John来更新或删除时,肯定不会更新或删除成功,如下所示:
mysql> update inno_tbl set name='张三' where name='John'; Query OK, 0 rows affected (0.00 sec) Rows matched: 0 Changed: 0 Warnings: 0 mysql> delete from inno_tbl where name='John'; Query OK, 0 rows affected (0.00 sec)
如果把隔离级别改成Read Commited, 则A会话中的查询语句不用加lock in share mode 或for update便可查询出B会话中已经更改提交的最新内容. 这种情况叫做不可重复读, 写到这里, 我有个小疑问, 是不是不可重复读和幻读是不是互相矛盾呢? 20181209答:不是, 不可重复读主要针对修改, 幻读主要针对插入和删除.
今天关于《Mysql Innodb事务隔离级别理解》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

- 上一篇
- 【MySQL】MySQL基础架构和查询过程

- 下一篇
- MySQL Community Server 5.7.18 deb安装以及实现主从复制
-
- 烂漫的黑夜
- 受益颇多,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者大大分享技术文章!
- 2023-04-04 13:26:59
-
- 自信的石头
- 这篇技术文章出现的刚刚好,太细致了,受益颇多,收藏了,关注师傅了!希望师傅能多写数据库相关的文章。
- 2023-03-29 10:20:25
-
- 舒心的哑铃
- 很详细,收藏了,感谢楼主的这篇博文,我会继续支持!
- 2023-03-13 13:59:35
-
- 简单的香氛
- 这篇博文真是及时雨啊,楼主加油!
- 2023-02-02 19:28:03
-
- 无聊的高跟鞋
- 这篇技术贴出现的刚刚好,好细啊,太给力了,码住,关注作者大大了!希望作者大大能多写数据库相关的文章。
- 2023-02-01 20:59:30
-
- 数据库 · MySQL | 11分钟前 |
- MySQL中as关键字到底是干嘛的?手把手教你用好别名功能
- 184浏览 收藏
-
- 数据库 · MySQL | 16分钟前 |
- MySQL查询优化or索引这样用,大神都在这么做!
- 124浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL排序慢?超简单优化技巧提升排序速度
- 475浏览 收藏
-
- 数据库 · MySQL | 2小时前 |
- MySQL主键外键这样用,手把手教你搞定关联关系
- 441浏览 收藏
-
- 数据库 · MySQL | 2小时前 |
- 手把手教你用MySQL建库建表,超详细教程分享
- 476浏览 收藏
-
- 数据库 · MySQL | 2小时前 | 错误处理 性能优化 MySQL存储函数 CREATEFUNCTION DETERMINISTIC
- MySQL存储函数怎么用?手把手教你创建与调用
- 462浏览 收藏
-
- 数据库 · MySQL | 3小时前 |
- MySQL数据归档秘籍&热门归档工具全曝光
- 386浏览 收藏
-
- 数据库 · MySQL | 3小时前 |
- MySQL增删改查语句全解,小白也能快速学会!
- 369浏览 收藏
-
- 数据库 · MySQL | 3小时前 |
- MySQL性能监控这样搞,主流指标全掌握!
- 142浏览 收藏
-
- 数据库 · MySQL | 3小时前 |
- MySQL中as怎么用?手把手教你搞定as别名技巧
- 474浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 茅茅虫AIGC检测
- 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
- 33次使用
-
- 赛林匹克平台(Challympics)
- 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
- 56次使用
-
- 笔格AIPPT
- SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
- 64次使用
-
- 稿定PPT
- 告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
- 61次使用
-
- Suno苏诺中文版
- 探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
- 64次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览