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

标签: dev | 发表时间:2019-02-14 00:00 | 作者:
出处:http://itindex.net/relian

前言

上周五,一同事在开发时遇到了一个问题,叫我帮忙看下.在描述这个同事遇到问题之前,我先简单做一些知识的铺垫,否则不好描述.这里面涉及到的知识点有 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还是 大肥朝就真的取决于我前面说的 隔离级别了.比如一个简单的改法是

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

写在最后

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

相关 [问题 原理] 推荐:

记一次MongoDB性能问题,附原理解析

- zffl - NoSQLFan
下面文章转载自火丁笔记,原作者描述了一次MongoDB数据迁移过程中遇到的性能问题及其解决方案,中间追查问题的方法和工具值得我们学习. 另外NoSQLFan还对作者略讲的问题产生原理进行了分析,希望对您有用. 最近忙着把一个项目从MySQL迁移到MongoDB,在导入旧数据的过程中,遇到了些许波折,犯了不少错误,但同时也学到了不少知识,遂记录下来.

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

- - IT瘾-dev
上周五,一同事在开发时遇到了一个问题,叫我帮忙看下.在描述这个同事遇到问题之前,我先简单做一些知识的铺垫,否则不好描述.这里面涉及到的知识点有 Spring的事务传播机制、 数据库的隔离级别等.. 本篇重点是解决同事遇到的问题,因为这两个知识点都先简单谈谈,只为引出主题.后面这两个会专门用一篇来讲.

一次CMS GC问题排查过程(理解原理+读懂GC日志)

- - ITeye博客
这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下. 1、问题的场景和处理过程;2、GC的一些理论东西;3、看懂GC的日志. 问题场景:线上机器在半夜会推送一个700M左右的数据,这个时候有个数据置换的过程,也就是说有700M*2的数据在heap区域中,线上系统超时比较多,导致了很严重(严重程度就不说了)的问题.

稿费问题

- Ruixing F - 创造社新任社长宋石男
据说现在全中国靠给平媒自由撰稿为生的,超不过1000人,而且不少处于相当窘迫的境况,就算想买根绳子来上吊,都买不起质量好的,结果绳子老断. 作为自由撰稿人的一员,我对此深有体会. 1999年国家版权局出台的基本稿酬标准,每千字30元-100元,至今仍为全国发行的报刊的“行业指导价”. 业内估计,全国报刊的稿费中位数大约也就在100元.

lvs 问题

- - 操作系统 - ITeye博客
1: LVS连接的持久时间. 1)同一个ip发来请求到同一台RS的持久超时时间. ipvsadm -A -t 192.168.169.100:80 -s rr -p 120     #该客户的请求120秒内被分配给同一台web.  2)一个链接创建后空闲时的超时时间(分别是:tcp的空闲超时时间、lvs收到客户端tcp fin的超时时间、udp的超时时间).

跨机房问题

- Shengbin - NOSQL Notes
跨机房问题一直都是一个老大难的问题,先看传统数据库的跨机房方案. Master/Slave方案. 这是最常用的方案,适用于大多数需求. Master将操作日志实时地发送到Slave,Slave当成Master的一个Hot Backup. Master宕机时,服务切换到Slave,需要修改客户端逻辑使得Master失效时自动寻找新的Master.

Hash Collision DoS 问题

- mazhechao - 酷壳 - CoolShell.cn
最近,除了国内明文密码的安全事件,还有一个事是比较大的,那就是 Hash Collision DoS (Hash碰撞的拒绝式服务攻击),有恶意的人会通过这个安全弱点会让你的服务器运行巨慢无比. 这个安全弱点利用了各语言的Hash算法的“非随机性”可以制造出N多的value不一样,但是key一样数据,然后让你的Hash表成为一张单向链表,而导致你的整个网站或是程序的运行性能以级数下降(可以很轻松的让你的CPU升到100%).

相关性问题

- - 扯氮集--上海魏武挥的博客 - 扯氮集--上海魏武挥的博客
人的本性是趋利避害的,任何合作(或者交易,或者搭伙,或者配对,反正就不是一个人干的事)都会存在三个可能:有利、有害、无利无害. 对于合作一方来说,至少应该保持一个无害的结果,这是常识. 如果觉得有害的可能性很大,于是,我们就会拒绝合作. 问题在于,谁也不是神仙,没有人可以事先100%断定合作必然会有利或至少无害,于是人们需要很多背景信息来供决策.

select 效率问题

- - C++博客_杨粼波
 很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解. 一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的10000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name='zhangsan'的,而后再根据限制条件条件tID>10000来提出查询结果.

IE11兼容问题

- - 研发管理 - ITeye博客
IE11下载地址:http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=40901. 安装IE10和IE11之前需要先保证操作系统是Service版本的. win7 sp1升级包下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=5842.