问题描述:

一个项目现场反馈,“差旅费类型的单据审批,在出现业务规则没满足的情况时(即业务报错,需要人机交互),审批仍然通过了”。从技术的角度上说,就是业务构件中的业务规则报错后,事务没有回滚。但是,维护的同事对事务回滚的代码增加了日志,通过日志发现事务回滚的代码显式的执行了,也没有出现任何异常。并且该问题可以反复重现,与并发也没有关系,单用户执行也会有问题。

分析过程:

接到这个问题时,我感觉很奇怪:从表面上看貌似跟该类单据的数据有关系,但从技术分析上看是与数据库事务控制有关系。按照道理上来讲,用户能够操作的业务定义类的数据,一般影响的是条件分支、业务判断等等,不应该能够影响到事务的执行。这时感觉有点蒙,突然有种无从下手的感觉。可能有人会说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 沿执行代码路径往返传播并且由该路径中的各个对象检查时,可将对象添加到其中。

https://msdn.microsoft.com/zh-cn/library/System.Runtime.Remoting.Messaging.CallContext(v=vs.100).aspx

记一次系统稳定性问题的分析处理过程(因CallContext使用不当而造成bug)的更多相关文章

  1. MTK平台系统稳定性分析

    目录 1:简介 2:怎么抓取和分析log 3:怎么确定问题点 简介 系统稳定性目前主要是解决系统死机重启. 分为两部分:Android /kernel Kernel 分析需要的文件和工具: Mtklo ...

  2. 性能测试——记XX银行保全项目性能问题分析优化

    记XX银行保全项目性能问题分析优化 数据库问题也许是大部分性能问题的关注点,但是JAVA应用与数据库交互的关节,JDBC 就像是我们人体的上半身跟下半身的腰椎,支持上半身,协调下半身运动的重要支撑点. ...

  3. LInux系统木马植入排查分析 及 应用漏洞修复配置(隐藏bannner版本等)

    在日常繁琐的运维工作中,对linux服务器进行安全检查是一个非常重要的环节.今天,分享一下如何检查linux系统是否遭受了入侵? 一.是否入侵检查 1)检查系统日志 检查系统错误登陆日志,统计IP重试 ...

  4. B2C电子商务系统研发——商品SKU分析和设计(二)

    转:http://www.cnblogs.com/winstonyan/archive/2012/01/07/2315886.html 上文谈到5种商品SKU设计模式,本文将做些细化说明. 笔者研究过 ...

  5. (转)Android 系统 root 破解原理分析

    现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...

  6. Android日志系统Logcat源代码简要分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6606957 在前面两篇文章Android日志系 ...

  7. PM2.5环境检测系统的设计与分析

    PM2.5环境检测系统的设计与分析   摘要: 大气颗粒物污染对人类健康和生态环境造成了很大的影响,这让人们逐渐重视起对细颗粒物PM2.5检测技术的研究.本文阐述了PM2.5浓度检测的五种方法,在对上 ...

  8. Db2性能:系统CPU高问题分析的一些思路

    Db2性能:系统CPU高问题分析的一些思路 1. 如何判断CPU高? 有很多操作系统的命令可以看出来,比如ps -elf,iostat, vmstat, top/topas, 2. 收集数据 CPU高 ...

  9. Android 系统 root 破解原理分析 (续)

    上文<Android系统root破解原理分析>介绍了Android系统root破解之后,应用程序获得root权限的原理.有一些网友提出对于root破解过程比较感兴趣,也提出了疑问.本文将会 ...

随机推荐

  1. 程序员是怎么炼成的---OC题集--练习答案与题目(3)

    1.init 2.initWithBytes:length:encoding: 3.initWithCharacters:length: 4.initWithCString:encoding: 5.i ...

  2. 破解 crackme(完全拆解警告窗口)

    系统 : Windows xp 程序 : crackme 程序下载地址 :http://pan.baidu.com/s/1kUrbcAr 要求 : 注册机编写 & 去除Nag窗口 使用工具 : ...

  3. 3、C#基础整理(语句概述)

    语句 语句分为四个大类: * 分支语句:if,if... else,if ...else if... else,switch case * 循环语句:for,while,do while,foreac ...

  4. LeetCode Combinations (DFS)

    题意: 产生从1-n的k个数的所有组合,按升序排列并返回. 思路: DFS一遍即可解决.注意升序. class Solution { public: vector<vector<int&g ...

  5. 用提交按钮提交form问题验证没通过依然提交表单

    <form id="sb" action="${pageContext.request.contextPath }/admin/loanContract/addOr ...

  6. selenium Gird

    selenium-server selenium Gird testcase-----------------hub -------------------node1 ---------------- ...

  7. iOS中的多线程及GCD

    多线程中的一些概念 //任务:代码段  方法  线程就是执行这些任务 //NSThread类 创建线程 执行线程 [NSThread isMainThread]//判断是否是主线程 #import & ...

  8. iPhone 6/iPhone 6 Plus硬件性能

    iPhone 6/iPhone 6 Plus硬件性能 评分 4 分 正 如之前传闻的,这次同时发布了两款iPhone产品,分别是4.7英寸的iPhone 6和5.5英寸的iPhone 6 Plus.苹 ...

  9. 转:db2 backup 及 restore

    db2 backup 及 restore 2011-06-21 18:12:20|  分类: AIX |举报 |字号 订阅     两个问题: db2=>list applications db ...

  10. nfs文件系统启动参数配置

    1. tiny6410(增强版)bootargs(nfs文件挂载)启动参数(周学伟) noinitrd console=ttySAC0,115200 lcd=S70 init=/init root=/ ...