记一次Mysql事务隔离级别的坑
最近在写代码调试时,遇到了一个问题。
遇到问题
具体操作如下:
1.调用方法A,并且方法A加上了@Transactional事务注解。
2.在方法A内部,查询并更新某个字段F的值。
3.处理其他逻辑。
4.查询并打印日志,记录关键字段的值,包括字段F。
5.方法A结束。
由于刚刚接手这块代码,而且这个方法又写得很长,所以很多逻辑都没法细看,只能慢慢调试。
我在第4步打了断点,调试时查看日志,感觉数据有问题,将sql复制到数据库里面手动跑了一遍,
发现在方法里和数据库里,执行同一条Sql,结果竟然不一样。
一开始还有点蒙圈,以为是IDE的bug,可能是缓存之类的问题。
然后又调试了几遍,单步调试时观察到手动在数据库里查出来的字段值,总是方法刚开始还未变更时的值。
恍然才明白,原来是事务隔离级别造成的。
事务隔离级别
这些知识点,其实以前面试都背得滚瓜烂熟。现在时间久了,一下子又忘光了。
Q:数据库的隔离级别有哪些?
读未提交(read-uncommitted)读提交(read-committed) 可重复读(repeatable-read)串行化(serializable)。
Q:mysql默认的数据库隔离级别是什么?
可重复读(repeatable-read)
一致性非锁定读
Mysql采用INNODB存储引擎。SELECT操作,使用一致性非锁定读。
在READ COMMITTED事务隔离级别下,对于快照数据,非一致性读总是读取被锁定的行的最新一份快照数据。
在REPEATABLE READ(可重复读)事务隔离级别下,对于快照数据,非一致性读总是读取事务开始时的行数据版本。
而我遇到的问题,就是说事务A开启后,变更了数据,还没有提交,然后事务B就去进行查询。
因为默认的REPEATABLE READ事务隔离级别,读取到的是事务开始时的行数据版本。
不同事务隔离级别可能出现的问题
1.脏读
脏读:脏数据是指未提交的数据。脏读是指在不同的事务下,当前事务可以读到另外事务未提交的数据。这显然违反了数据库的隔离性。
脏读发生的事务隔离级别:READ UNCOMMITED。
2.不可重复读
不可重复读:在一个事务内两次读到的数据不一样。比如,A事务还没有结束,B事务对同一数据进行修改,由于B事务的修改,那么A事务两次读到的数据是不一样的。违背了数据库事务一致性的要求。
不可重复读,读到的是已经提交的数据。
不可重复读,发生的隔离级别是READ COMMITTED。
3.幻读:A事务读取了B事务已经提交的新增数据。
4.丢失更新
丢失更新,是指一个事务的更新操作会被另一个事务的更新操作覆盖。
参考资料:《Mysql技术内幕》
记一次Mysql事务隔离级别的坑的更多相关文章
- 记一次 Spring 事务配置踩坑记
记一次 Spring 事务配置踩坑记 问题描述:(SpringBoot + MyBatisPlus) 业务逻辑伪代码如下.理论上,插入数据 t1 后,xxService.getXxx() 方法的查询条 ...
- 记一次mysql事务未提交导致锁未释放的问题
记一次mysql事务未提交导致锁未释放的问题 ## 查看未提交的事务(3秒内未操作的事务) SELECT p.ID AS conn_id, P.USER AS login_user, P.HOST A ...
- 【踩坑记录】记一次MySQL主从复制延迟的坑
最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误. 情景 一个活动信息需要审批,审批之后才能生效.因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容, ...
- MySQL事务隔离级别的实现原理
回顾 在MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别. 读未提交:一个事务可以读取到另一个事务未提交的修改.这会带来脏读.幻读.不可 ...
- Mysql事务隔离级
转自:http://xm-king.iteye.com/blog/770721 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般 ...
- MySQL事务(二)事务隔离的实现原理:一致性读
今天我们来学习一下MySQL的事务隔离是如何实现的.如果你对事务以及事务隔离级别还不太了解的话,这里左转. 好的,下面正式进入主题.事务隔离级别有4种:读未提交.读提交.可重复读和串行化.首先我们来说 ...
- Mysql事务隔离级别学习
这篇文章主要谈谈Mysql事务隔离级别的区别,以及自己的一些感受. 自己一直以来没搞懂“可重复读”和可提交读“两者之间的区别,通过此次的实践,清楚了两者之间的区别.废话不说,先上图看看这几个事务隔离级 ...
- MySQL事务实现原理
MySQL事务隔离级别的实现原理 知识储备 只有InnoDB支持事务,所以这里说的事务隔离级别是指InnoDB下的事务隔离级别 隔离级别 读未提交:一个事务可以读取到另一个事务未提交的修改.这会带来脏 ...
- 深度剖析 MySQL 事务隔离
概述 今天主要分享下MySQL事务隔离级别的实现原理,因为只有InnoDB支持事务,所以这里的事务隔离级别是指InnoDB下的事务隔离级别. 隔离级别 读未提交:一个事务可以读取到另一个事务未提交的修 ...
随机推荐
- .net core (领域事件,并发 for update) 工作内容记录
这周工作,因为要对几个不同的表进行货币增加,锁定,所以 用了领域事件和并发 for update ,先记录一下 领域事件 ,Dapper 事务 ,sql for update 这几个点 头大,最近工 ...
- WPF 高级篇 MVVM (MVVMlight) 依赖注入使用Messagebox
原文:WPF 高级篇 MVVM (MVVMlight) 依赖注入使用Messagebox MVVMlight 实现依赖注入 把弹框功能 和接口功能注入到各个插件中 使用依赖注入 先把所有的ViewMo ...
- linux 定时器日志操作
首先先打开定时器的日志(默认是注释掉的) cron的日志功能使用syslogd服务,不同版本号linux可能装了不同的软件,这里介绍常见的两种: rsyslog-> 位置在 /etc/rsysl ...
- 浅聊几种主流Docker网络的实现原理
原文:https://mp.weixin.qq.com/s/Jdxct8qHrBUtkUq-hnxSRw 参考:https://blog.csdn.net/yarntime/article/detai ...
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
- express和express-generator搭建web应用
nodemon的安装使用 安装 npm i nodemon -D 配置 新建nodemon.json { "watch": "src/**/*.* } 修改package ...
- HTML实现百度分享插件分享网页
一.HTML代码如下: <div class="bdsharebuttonbox"> <a href="#" class="bds_ ...
- Odoo form视图详解
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826350.html 一:Header头部 header区域一般用于展示文档流转的阶段和生命周期,以及动作 ...
- PacMan 03——追踪玩家
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- python安装第三方库--换镜像源
python安装第三方库--换镜像源 1. 更换anaconda源 清华大学镜像:清华大学镜像 anaconda下载地址:https://mirrors.tuna.tsinghua.edu.cn/an ...