记一次系统稳定性问题的分析处理过程(因CallContext使用不当而造成bug)
问题描述:
一个项目现场反馈,“差旅费类型的单据审批,在出现业务规则没满足的情况时(即业务报错,需要人机交互),审批仍然通过了”。从技术的角度上说,就是业务构件中的业务规则报错后,事务没有回滚。但是,维护的同事对事务回滚的代码增加了日志,通过日志发现事务回滚的代码显式的执行了,也没有出现任何异常。并且该问题可以反复重现,与并发也没有关系,单用户执行也会有问题。
分析过程:
接到这个问题时,我感觉很奇怪:从表面上看貌似跟该类单据的数据有关系,但从技术分析上看是与数据库事务控制有关系。按照道理上来讲,用户能够操作的业务定义类的数据,一般影响的是条件分支、业务判断等等,不应该能够影响到事务的执行。这时感觉有点蒙,突然有种无从下手的感觉。可能有人会说debug一下不就行了吗?是的,在我们面对demo程序、职责单一的模块、简单小系统的bug时,终极的排查方案可以使用debug调试。不过随着系统越来越复杂,业务层模块与底层平台之间会形成纵向依赖,模块、子系统甚至第三方系统之间会形成横向集成,此时debug往往显得力不从心。
经过几种简单的排查、推测后,我想到的是借助SqlServer Profiler分析问题:在跟踪事件中增加所有的脚本、异常及事务类的事件,在跟踪结果中分析各脚本与事务的匹配关系,本来应该回滚的SQL脚本对应的事务是在哪里commit?,显式回滚的事务又是从哪里开始的?这样就可以根据SQL脚本为线索快速定位到对应的代码模块。呵呵,看起来很快就要出结果了。马上与现场人员沟通跟踪方案,结果该客户使用的是Oracle数据库,糟糕,目前尚未发现Oracle对相对应的工具!虽然v$sql等性能视图可以查询对应的SQL,但至关重要的是事务与脚本匹配关系如何获得呢?好像又陷入了未知……
查看Oracle的日志,没有发现错误、异常信息,难道事务中包含DDL脚本?单用户场景下清空shared_pool重现问题,没有发现DDL脚本。难道事务有问题?于是我在事务回滚的代码之前加一个简单的Insert脚本,结果该insert操作被回滚了。此时突然发现,有一个SQL在业务出现异常后,按道理说是不应该被执行的,但目前也被持久化到数据库了。也就是说如果找到了执行该SQL的代码,应该离原因就比较近了。马上想到一个工具------RedGate Performance Profiler。
以下是RedGate的跟踪情况,从调用堆栈上看,该SQL的代码是异步执行的??很是奇怪,异步线程为什么会触发父线程的持久化操作?
调阅对应的程序代码发现,果然是异步执行的,分支中判断了一个Contex的值。需要进一步查阅代码。。。
问题解决:
打开这段代码一看就比较清楚了,这里使用了CallContext的LogicalGet/Set(即创建的子线程会复制父线程的上下文变量),经确认此处不需要这种“继承关系”,改为CallContext.GetData/SetData后问题解决。以后再使用时一定注意。
关于CallContext,微软给出的说明很简单:
CallContext 是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽。数据槽不在其他逻辑线程上的调用上下文之间共享。当 CallContext 沿执行代码路径往返传播并且由该路径中的各个对象检查时,可将对象添加到其中。
记一次系统稳定性问题的分析处理过程(因CallContext使用不当而造成bug)的更多相关文章
- MTK平台系统稳定性分析
目录 1:简介 2:怎么抓取和分析log 3:怎么确定问题点 简介 系统稳定性目前主要是解决系统死机重启. 分为两部分:Android /kernel Kernel 分析需要的文件和工具: Mtklo ...
- 性能测试——记XX银行保全项目性能问题分析优化
记XX银行保全项目性能问题分析优化 数据库问题也许是大部分性能问题的关注点,但是JAVA应用与数据库交互的关节,JDBC 就像是我们人体的上半身跟下半身的腰椎,支持上半身,协调下半身运动的重要支撑点. ...
- LInux系统木马植入排查分析 及 应用漏洞修复配置(隐藏bannner版本等)
在日常繁琐的运维工作中,对linux服务器进行安全检查是一个非常重要的环节.今天,分享一下如何检查linux系统是否遭受了入侵? 一.是否入侵检查 1)检查系统日志 检查系统错误登陆日志,统计IP重试 ...
- B2C电子商务系统研发——商品SKU分析和设计(二)
转:http://www.cnblogs.com/winstonyan/archive/2012/01/07/2315886.html 上文谈到5种商品SKU设计模式,本文将做些细化说明. 笔者研究过 ...
- (转)Android 系统 root 破解原理分析
现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...
- Android日志系统Logcat源代码简要分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6606957 在前面两篇文章Android日志系 ...
- PM2.5环境检测系统的设计与分析
PM2.5环境检测系统的设计与分析 摘要: 大气颗粒物污染对人类健康和生态环境造成了很大的影响,这让人们逐渐重视起对细颗粒物PM2.5检测技术的研究.本文阐述了PM2.5浓度检测的五种方法,在对上 ...
- Db2性能:系统CPU高问题分析的一些思路
Db2性能:系统CPU高问题分析的一些思路 1. 如何判断CPU高? 有很多操作系统的命令可以看出来,比如ps -elf,iostat, vmstat, top/topas, 2. 收集数据 CPU高 ...
- Android 系统 root 破解原理分析 (续)
上文<Android系统root破解原理分析>介绍了Android系统root破解之后,应用程序获得root权限的原理.有一些网友提出对于root破解过程比较感兴趣,也提出了疑问.本文将会 ...
随机推荐
- HDU 4386
http://acm.hdu.edu.cn/showproblem.php?pid=4386 题意:给四条边长,问能否组成四边形,如果能,求最大面积 求最大面积用海伦公式的四边形推广,p=(a+b+c ...
- beta 阶段的 postmortem 报告
part一: 用户数:目前约30人 总结:与当初的预算差不多,首先1.第一次开发软件,经验效率不足,那是很正常的事情.2.用户数量少,因为宣传力度还是比较的少.应该加强软件的推广才行. part二: ...
- Intellij IDEA 工具快捷键
IntelliJ Idea 常用快捷键列表 Alt+回车 导入包,自动修正Ctrl+N 查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代码Ctrl+Alt+O 优化导入的类 ...
- Python CSV模块处理文件读写
下面是一个简单的csv文件 Title,Release Date,Director And Now For Something Completely Different,1971,Ian MacNau ...
- ODBC接口规范
第1章 ODBC API基础 1.1 ODBC API句柄 ODBC API 实现数据库操作的手段是句柄.在ODBC中,使用不同的句柄(HANDLE)来标志环境(environment).连接 ...
- TC HTB r2q
HTB: quantum of class 10001 is big. Consider r2q change. 根据HTB的官方文档显示,quantum是在可以“借”的情况下,一次可以“借”多少,并 ...
- (基础篇)PHP与JavaScript交互
一.了解javascript Javascript是脚本编程语言,支持WEB应用程序的客户端和服务器端构件的开发,在WEB系统中得到了非常广泛的应用. 1. 什么是javascript Javascr ...
- Centos6下DRBD的安装配置
导读 Distributed Replicated Block Device(DRBD)是一个用软件实现的.无共享的.服务器之间镜像块设备内容的存储复制解决方案.数据镜像:实时.透明.同步(所有服务器 ...
- Prepared Java infrastructure for distributed scenarios
code is sited on: https://github.com/zhoujiagen/javaiospike progress 2015/5/27 Nio/Nio2 examples, us ...
- Java 抓取网页内容
前两天想写一段自动提取微博状态的代码.据我所知,实现这个功能即可以用PHP写,也可以用Java写.我认为用Java写调试方便一点,PHP的脚本还要上传到服务器什么的. 代码很简单的,新建一个java. ...