记一次系统稳定性问题的分析处理过程(因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破解过程比较感兴趣,也提出了疑问.本文将会 ...
随机推荐
- HDU3930 (原根)
给定方程 X^A = B (mol C) ,求 在[0,C) 中所有的解 , 并且C为质数. 设 rt 为 C 的原根 , 则 X = rt^x (这里相当于求 A^x =B (mol C) 用大 ...
- 解决div里插入img下边缝隙问题
<html> <head> <title> new document </title> <meta name="author ...
- 中文圣经 for Android
中文圣经(For Android) 目前,中文圣经App包含了如下圣经版本: 和合本 现代中文译本 吕振中译本 中文新译本 英文标准本(ESV) King James Version(KJV) New ...
- 转:TimeSpan的用法
转:http://www.cnblogs.com/shuang121/archive/2011/03/03/1969583.html 举例:时间增加一天:DateTime.Parse(txt_Date ...
- LeetCode Find the Duplicate Number 找重复出现的数(技巧)
题意: 有一个含有n+1个元素的数组,元素值是在1-n之间的整数,请找出其中出现超过1次的数.(保证仅有1个出现次数是超过1的数) 思路: 方法一:O(nlogn).根据鸽笼原理及题意,每次如果< ...
- python发布文件(windows)
怎样发布文件 首先发布本地文件有一个好的用处,就是省去了朋友同import的时候还要使用sys.path,省的自己出错 1.新建文件夹d:\ tool 在的d:\tool文件夹中建立login.py ...
- Oracle执行语句跟踪(2)——使用10046事件实现语句追踪
接上篇博文Oracle执行语句跟踪(1)--使用sql trace实现语句追踪,一旦我们通过会话追踪获取到超时事物的执行语句,就可以使用10046事件对语句进行追踪. 启用10046事件追踪的方式 S ...
- 在centos使用rpm包的方式安装mysql,以及更改root密码
在centos使用rpm包的方式安装mysql,对于centos官方实际推荐使用yum进行安装,下载安装的方式主要用于内网服务器不能连接外网yum源的情况. 下载包 首先根据centos版本在mysq ...
- Spring MVC+Maven+Freemarker+Mybatis开发环境搭建
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 创建一个Spring MVC项目 集成Freemarker 集成Mybatis Mybatis自动生成工具 利用STS( ...
- 第二章 C语言编程实践
上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...