从一次问题排查聊聊问什么要懂原理

栏目: Java · 发布时间: 5年前

内容简介:上周五,一同事在开发时遇到了一个问题,叫我帮忙看下.在描述这个同事遇到问题之前,我先简单做一些知识的铺垫,否则不好描述.这里面涉及到的知识点有本篇重点是解决同事遇到的问题,因为这两个知识点都先简单谈谈,只为引出主题.后面这两个会专门用一篇来讲Sring的事务传播机制有七种,本文涉及到的有两种

前言

上周五,一同事在开发时遇到了一个问题,叫我帮忙看下.在描述这个同事遇到问题之前,我先简单做一些知识的铺垫,否则不好描述.这里面涉及到的知识点有 Spring的事务传播机制数据库的隔离级别 等.

本篇重点是解决同事遇到的问题,因为这两个知识点都先简单谈谈,只为引出主题.后面这两个会专门用一篇来讲

Spring的事务传播机制

Sring的事务传播机制有七种,本文涉及到的有两种

REQUIRED : 用得最多(估计高达90%),也是默认的模式.若当前没有事务,则新建事务,若当前已存在一个事务, 则加入到该事务中

REQUIRES_NEW : 新建一个事务

Spring的事务传播机制.后面我会用一篇文章专门来讲,给大家列各种典型的题型,按照高中的题型训练模式,彻底弄懂Spring的传播机制,即使在各种 复杂嵌套 + try 场景下也能云淡风轻地确定回滚情况.包括解析之前非常经典的一道面试题

  • 做51次操作,前面50次成功,第51次失败,全部回滚

  • 做51次操作,前面50次成功,第51次失败,只回滚第51次,全面50次照常提交

事务的隔离级别

考虑到部分同学英文问题,我特意标记了中文

1. Read Uncommitted : 读未提交

这个基本不可能用,从字面意思你就知道了,读到别人还未提交的数据,别人都没提交,你怎么知道别人接下来是要提交还是回滚?既然不知道你就读,自然会有问题.这个问题就是我们说的 脏读 .

2. Serializable : 串行化

其实就是同步化,性能太差,基本不可能用这个.但是这个是唯一能解决 幻读 问题的.

画图分析

剩下两种隔离级别

  • Read Committed : 读已提交

  • Read Repeatable : 可重复读

就比较重要了,我们画图来分析

从一次问题排查聊聊问什么要懂原理

比如我问,当 t4 时,查询出来的数据,name是 大肥朝 还是 toby .其实你内心就不是很确定了,但是我如果把 提交事务 这几个字加粗标红,然后引诱一下,绝大多数同学 根本把持不住!!!

从一次问题排查聊聊问什么要懂原理

既然都 提交事务 了,那读出来的自然是 toby 啦.

其实 t4 读出来是 toby 还是 大肥朝 这个取决与你用的是 读已提交可重复读 .其实你从这个中文名称都可以猜到了,如果是 读已提交 ,那么查出来的就是 toby .如果是 可重复读 .读出来的自然就是 大肥朝 .

MySQL 默认用的是 可重复读 . Oracle 默认用的是 读已提交 .

温馨提示: 这个后面也可以考虑再写一篇详细讲一下这个隔离级别,因为一般问到 可重复读 ,有深度的面试官会继续追问,可重复读是如何实现的?具体怎么实现的我们可以先关注肥朝公众号,后面再具体说数据库的 MVCC 机制

问题描述

由于业务具有一定的复杂度,不利于大家观看,因此我这里特意抽象简化了模型.

从一次问题排查聊聊问什么要懂原理

从一次问题排查聊聊问什么要懂原理

从一次问题排查聊聊问什么要懂原理

从一次问题排查聊聊问什么要懂原理

首先,我先把数据库的隔离级别改成 读已提交 .截图为证:

从一次问题排查聊聊问什么要懂原理

那么问题来了,请问步骤3查询出来的数据是什么呢.我们一起来见证

见证答案

1.查询完数据,准备更新数据

从一次问题排查聊聊问什么要懂原理

2.更新完成提交了事务,我们看得出此时数据库已经改成了 toby

从一次问题排查聊聊问什么要懂原理

3.震惊!查出来的数据竟然是 大肥朝

从一次问题排查聊聊问什么要懂原理

这个时候似乎就不厚道了,肥朝你前面怎么说的,你前面说 读已提交 读出来的是别人已经提交的,那么应该是 toby 才对啊,怎么还是 大肥朝 ?.

从一次问题排查聊聊问什么要懂原理

开始排查

我们把配置文件设置成 debug 级别一切就豁然开朗了

logging.level.com.toby.demo.dao=debug
logging.level.org.mybatis=debug

从一次问题排查聊聊问什么要懂原理

这里我特意用不同颜色给大家标记清楚了,其实看到只输出两次 SQL 日志大家就知道了.第三次查询没有输出SQL,这很明显是用到了 Mybatis 的缓存了.再根据我标记的 SqlSession 信息来看,这里就是用到了 Mybatis一级缓存

解决办法

解决办法有很多,我们知道Mybatis一级缓存的作用域是 SqlSession ,那么只要两次查询是不同的 SqlSession 那自然这个一级缓存就失效了.一级缓存失效了.就会查询两次,输出两次sql.这个时候是 toby 还是 大肥朝 就真的取决于我前面说的 隔离级别 了.比如一个简单的改法是

从一次问题排查聊聊问什么要懂原理

改法有很多,具体根据那么的业务来就可以了,当然也可以采用上面那种

写在最后

关注肥朝公众号,后续还会有更多奇巧淫技,真实企业场景源码级实战和大家分享.让"原理"不再只是面试装逼.也欢迎大家留言一起交流精进.

从一次问题排查聊聊问什么要懂原理


以上所述就是小编给大家介绍的《从一次问题排查聊聊问什么要懂原理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

精彩绝伦的CSS

精彩绝伦的CSS

[美] Eric A. Meyer / 姬光 / 人民邮电出版社 / 2012-7 / 49.00元

内容简介: 打造现代布局的专业技术 本书远非只是介绍基础知识,它不仅全面细致地讲解布局与效果,而且展望了HTML5和CSS3的未来。业内很少有人能像Eric A. Meyer一样详细阐明CSS,他在本书中深入分析了普遍适用的实用技术,讲解了如何选用正确的工具、如何通过jQuery使用CSS效果和CSS3技术。 本书主要内容如下: 显示或隐藏元素 通过XHTML为bod......一起来看看 《精彩绝伦的CSS》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具