昨天在MES项目中,需要在业务逻辑的几个关键点记录错误信息,需要把错误信息写入数据表. 但是由于整个业务逻辑都是包在一个事务模板里面的
比如这样的:
        WhhTransactionTemplate transactionTemplate2 = new WhhTransactionTemplate(true);
transactionTemplate2.execute(new WhhTransactionCallback() {
@SuppressWarnings({ "unchecked", "unused" })
@Override
public Object doInTransaction(){
save_mes_do_materials_detail(batchDateList,para);
matnrCostWithNothing(batchDateList,para,result,res);
//省略....
logerror(para, "原辅料消耗上传 调用sap功能出错!" + invokeResult.getInvokeResultMessage(), "消耗上传");
//省略....
return null;
}
});
导致logerror方法也被包含在事务中,一旦业务出错,事务回滚,那么链logerror方法写入的错误信息也会被回滚,导致无法记录下错误日志.
这和平时的事务嵌套就不一样,一般都是内层事务加入外层事务的,这里就需要内层事务暂时退出事务管理才行. 
 
这里就涉及到事务嵌套的问题, 外层事务是存在的这个就不用说了,那么此时logerror的逻辑应该要脱离事务环境才对,于是很自然的就想到应该使用
PROPAGATION_NOT_SUPPORTED 的传播特性.
 
之前分析过spring源码,知道在内层事务传播特性为PROPAGATION_NOT_SUPPORTED 的时候,会把外层事务挂起,把线程绑定的ConnectionHolder给清除掉,
导致内层事务里的方法需要获取Connection的时候,只能重新从dataSource获取 ,既然Connection不一样了,自然也就不受上层事务的影响. 
 
于是把logerror方法修改如下
    public void logerror(final Map para, final String info, final String errortype){
TransactionTemplate tempTemplate= DBConnectManager.getDefaultDBConnectBean().getTransactionTemplate();
//首先修改当前这个tempTemplate的传特性为PROPAGATION_NOT_SUPPORTED
tempTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED );
tempTemplate.execute(new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus status) {
para.put("info", info);
para.put("errortype", errortype);
DataAdapter dataAdapter = new DataAdapter();
dataAdapter.insert("insert into mes_error_info (wid,pid,errorinfo,errortype) values($wid$,0,#info#,#errortype#)",para);
return null;
}
});
//执行完之后 tempTemplate的传特性要改回PROPAGATION_REQUIRED
tempTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED );
}
这样一来 记录错误信息的代码就不会受到外层事务的影响了,最后记得方法执行完,一定要把传播特性改回PROPAGATION_REQUIRED,毕竟tempTemplate是单例的,
如果不改回来,其他代码要事务管理的时候,就没有作用了
 
 
 
 
 
 

MES项目中出现的一个事务嵌套的使用场景的更多相关文章

  1. SQL Server误区30日谈 第26天 SQL Server中存在真正的“事务嵌套”

    误区 #26: SQL Server中存在真正的“事务嵌套”错误 嵌套事务可不会像其语法表现的那样看起来允许事务嵌套.我真不知道为什么有人会这样写代码,我唯一能够想到的就是某个哥们对SQL Serve ...

  2. Laravel 项目中编写第一个 Vue 组件

    和 CSS 框架一样,Laravel 不强制你使用什么 JavaScript 客户端框架,但是开箱对 Vue.js 提供了良好的支持,如果你更熟悉 React 的话,也可以将默认的脚手架代码替换成 R ...

  3. 在类库或winform项目中打开另一个winform项目的窗体

    假设类库或winform项目为A,另一个winform项目为B.那麽在A中添加一个接口,里面有一个Show方法,然后在B中写一个类b继承这个接口,并重写这个方法,具体内容为弹出某个窗体.然后在A中另一 ...

  4. 在Qt项目中如何添加一个已有的项目作为子项目

    新建一个子目录项目(具体方法参见<类似Visual Studio一样,使用Qt Creator管理多个项目,创建子项目>),然后需要添加的项目移动到该子目录项目目录下,再在其pro文件中添 ...

  5. nodejs自己在项目中使用的一个工具库utils.js文件

    文件内容如下: /** * utils.js */ var crypto = require('crypto'); var url = require('url'); var querystring ...

  6. Eclipse中在android项目中出现新建一个Activity后,出现整个project的报错以及包导入以后无法执行等等情况分析。

    今天用Eclipse去写android项目,然后后面须要建一个Blank  Activity后,非常正常的建立的.然后那个Activity是基于ActionBarAtivity,要导入v7,结果由于这 ...

  7. 自己在项目中写的一个Jquery插件和Jquery tab 功能

    后台查询结果 PDFSearchResult实体类: [DataContract(Name = "PDFSearchResult")] public class PDFSearch ...

  8. 如何在maven项目中引用领一个项目

    1 有两个项目 maven01  和maven 02,想在maven 02中引用maven01的方法,该如何操作呢 maven01中Factory类中的方法 public class Factory ...

  9. java模板模式项目中使用--封装一个http请求工具类

    需要调用http接口的代码继承FundHttpTemplate类,重写getParamData方法,在getParamDate里写调用逻辑. 模板: package com.crb.ocms.fund ...

随机推荐

  1. maven 搭建企业级web项目

    就看这篇文章了:http://www.cnblogs.com/quanyongan/archive/2013/05/28/3103243.html

  2. linux 下 epoll 编程

    转载自 Linux epoll模型 ,这篇文章讲的非常详细! 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显 ...

  3. 一起啃PRML - 1.2.1 Probability densities 概率密度

    一起啃PRML - 1.2.1 Probability densities @copyright 转载请注明出处 http://www.cnblogs.com/chxer/ 我们之前一直在讨论“谁取到 ...

  4. jquery方法详解--bind(type, [data], fn)

    转自:http://www.zhufengpeixun.cn/jquery/bind_type_data_fn.html bind(type, [data], fn)  返回值::jQuery 概述 ...

  5. (转载)PHP 判断常量,变量和函数是否存在

    (转载)http://www.jb51.net/article/17881.htm 如果你看懂了上面一句话,那么接下来都是废话,PHP手册写的还是很全的.一句话就把我标题中的问题全部解决了. 还是举几 ...

  6. < < < 2013年国家集训队作业 > > >

    完成题数/总题数:  道/37道 1.  A1504. Book(王迪): 数论+贪心   ★★☆        2013中国国家集训队第二次作业 2.  A1505. 树(张闻涛): 倍增LCA+可 ...

  7. Android webView 正确的用法

    Android webView 正确的用法 引言: 我在网络找了几个例子,基本上都有问题,<Android疯狂讲义>13.4中的源代码也有问题.终于在官网找到正确的用法.点我. 基本用法: ...

  8. 【转】开始使用Mac OS X——写给Mac新人

    写这篇文档的原因有两个,一.身边使用Mac的朋友越来越多,经常会有人来咨询一些常见的使用问题,比如:“为什么把界面右上角的红色按钮叉掉,程序还没有关闭?”之类.而且我也不愿意看到很多人使用OSX时仅仅 ...

  9. 【转】tmux入门指南

    按照官方说明,tmux是一个终端复用软件.我接触tmux也就是这几天的事情,但已经发现其强大.作为一个文艺程序员,有必要向大家分享一下,这么好的东东怎敢藏着掖着. 先用起来再说 假设你已经装好tmux ...

  10. zoj 3819 Average Score

    Average Score Time Limit: 2 Seconds      Memory Limit: 65536 KB Bob is a freshman in Marjar Universi ...