最近在写代码调试时,遇到了一个问题。

遇到问题

具体操作如下:
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事务隔离级别的坑的更多相关文章

  1. 记一次 Spring 事务配置踩坑记

    记一次 Spring 事务配置踩坑记 问题描述:(SpringBoot + MyBatisPlus) 业务逻辑伪代码如下.理论上,插入数据 t1 后,xxService.getXxx() 方法的查询条 ...

  2. 记一次mysql事务未提交导致锁未释放的问题

    记一次mysql事务未提交导致锁未释放的问题 ## 查看未提交的事务(3秒内未操作的事务) SELECT p.ID AS conn_id, P.USER AS login_user, P.HOST A ...

  3. 【踩坑记录】记一次MySQL主从复制延迟的坑

    最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误. 情景 一个活动信息需要审批,审批之后才能生效.因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容, ...

  4. MySQL事务隔离级别的实现原理

    回顾 在MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别. 读未提交:一个事务可以读取到另一个事务未提交的修改.这会带来脏读.幻读.不可 ...

  5. Mysql事务隔离级

    转自:http://xm-king.iteye.com/blog/770721 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般 ...

  6. MySQL事务(二)事务隔离的实现原理:一致性读

    今天我们来学习一下MySQL的事务隔离是如何实现的.如果你对事务以及事务隔离级别还不太了解的话,这里左转. 好的,下面正式进入主题.事务隔离级别有4种:读未提交.读提交.可重复读和串行化.首先我们来说 ...

  7. Mysql事务隔离级别学习

    这篇文章主要谈谈Mysql事务隔离级别的区别,以及自己的一些感受. 自己一直以来没搞懂“可重复读”和可提交读“两者之间的区别,通过此次的实践,清楚了两者之间的区别.废话不说,先上图看看这几个事务隔离级 ...

  8. MySQL事务实现原理

    MySQL事务隔离级别的实现原理 知识储备 只有InnoDB支持事务,所以这里说的事务隔离级别是指InnoDB下的事务隔离级别 隔离级别 读未提交:一个事务可以读取到另一个事务未提交的修改.这会带来脏 ...

  9. 深度剖析 MySQL 事务隔离

    概述 今天主要分享下MySQL事务隔离级别的实现原理,因为只有InnoDB支持事务,所以这里的事务隔离级别是指InnoDB下的事务隔离级别. 隔离级别 读未提交:一个事务可以读取到另一个事务未提交的修 ...

随机推荐

  1. 前端学习:JS面向对象知识学习(图解)

    前端学习:JS面向对象知识学习(图解) 前端学习:JS(面向对象)代码笔记 JS面向对象图解知识全览 创建类和对象 方式1:使用Object()函数 方式2:使用自变量 方式3:使用工厂函数 创建多个 ...

  2. MySQL如何定位慢sql

    MySQL如何定位慢sql MySQL"慢SQL"定位 数据库调优我个人觉得必须要明白两件事 1.定位问题(你得知道问题出在哪里,要不然从哪里调优呢) 2.解决问题(这个没有基本的 ...

  3. juc包下四大并发工具

    juc.CountDownLatch 闭锁 一个线程在等待一组线程后再恢复执行 await()等待其他线程执行完毕 被等待线程执行完毕后计数器-1 如何知道其他线程执行完了? 计数器,若一组线程为,C ...

  4. 未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。

    网站部署到IIS提示Microsoft.Web.Infrastructure,未能加载 解决方案 使用nuget安装 Microsoft.Web.Infrastructure拷贝到bin目录下面

  5. win10安装MySQL5.6.

    我分了两种下载安装的方式给大家看,注意数据库这个东西不在乎版本是不是最新,在乎的是够稳定,现在公司中常用的是mysql5.5和mysql5.6的版本,我现在就用mysql5.6的版本给大家来演示一下: ...

  6. html5新增表单控件和表单属性

    表单验证 Invalid事件 : 验证反馈 input.addEventListener('invalid',fn,false) 阻止默认验证:ev.preventDefault() formnova ...

  7. Angular4项目运行时URL自动加#方法

    import {HashLocationStrategy , LocationStrategy} from '@angular/common'; @NgModule({   declarations: ...

  8. CSS 总结 [目录]

    一.CSS 基础 1.CSS 初识 2.CSS 用法和特性 二.CSS 选择器 1.基本选择器 2.组合选择器 3.属性选择器 4.伪类选择器 5.伪元素选择器 三.CSS 字体样式 四.CSS 文本 ...

  9. SPring boot jpa 封装查询条件

    最近使用spring data jpa做了两个项目,对于动态查询的不友好做了个类似hibernate的封装,记录也分享下 首先定义一个所有条件的容器,继承Specification /** * 定义一 ...

  10. (原)Ubuntu安装TensorRT

    转载请注明出处: https://www.cnblogs.com/darkknightzh/p/11129472.html 参考网址: https://docs.nvidia.com/deeplear ...