`
wangjian5748
  • 浏览: 204532 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

一个典型的事务使用错误分析

阅读更多

下面是我在开发中遇到一个事务使用错误案例

try {	// buisness operation	ut = Trans.getUserTransaction();	ut.begin();	if ("add".equals(actionType)) {		addAccutor(moduleName, productId, liabId, accutor,				nextExecuteOrder);	} else if ("delete".equals(actionType)) {		deleteAccutor(moduleName, productId, liabId, listId);	} else if ("changeInputSource".equals(actionType)) {		changeInputSource(moduleName, inputSource, listId);	} else if ("moveup".equals(actionType)) {		moveUpAccutor(moduleName, listId);	} else if ("movedown".equals(actionType)) {		moveDownAccutor(moduleName, listId);	}	ut.commit();	// load Data	loadData(moduleName, request, form, productId, liabId);	return mapping.findForward("AccutorBenefit");} catch (Exception e) {	if (ut != null) {		try {			ut.rollback();		} catch (Exception e1) {			throw ExceptionFactory.parse(e1);		}	}	throw ExceptionFactory.parse(e);}

上面代码会有几种执行情况:
没异常发生时,不会有任何问题(这好像是废话);
有异常发生时,若异常发生在ut.commit之前没有问题;
若在执行loadData(moduleName, request, form, productId, liabId)发生异常,开始执行异常捕获,首先执行事务回滚,这是事务早已回滚,所以抛出No active Transaction.
这就导致最后抛出的是异常1,而在这之前抛出的异常2被虚拟机丢了,这和bruce eckel在thinking in java中讲到的java异常缺陷类似,都是丢掉前面的异常,抛出一个不相干异常.
改正方式:
1.其实这个地方不需要使用事务,删掉事务代码
2.把commit放到return之前执行
总结:
这里有两点值得我们关注:
1.这种错误的使用事务方式,导致了问题,以及改正方式
2.错误使用java异常机制的场景,vm丢掉了异常.

异常1
java.lang.IllegalStateException: No active Transaction	at com.evermind.server.ApplicationServerTransactionManager.rollback(ApplicationServerTransactionManager.java:398)	at com.company.pub.util.internal.DBTransaction.rollback(DBTransaction.java:108)	at com.company.lf.product.ctrl.accutor.AccutorBenefitAction.process(AccutorBenefitAction.java:74)	at com.company.pub.framework.GenericAction.execute(GenericAction.java:250)	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)	at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)	at com.evermind.server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:65)	at com.company.pub.framework.XssFilter.doFilter(XssFilter.java:96)	at com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.java:16)	at com.company.pub.framework.AppFilter.doFilter(AppFilter.java:83)	at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:600)	at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:317)	at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:790)	at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:208)	at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:125)	at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:192)	at java.lang.Thread.run(Thread.java:534)
异常2
java.lang.NullPointerException	at java.lang.Class.forName0(Native Method)	at java.lang.Class.forName(Class.java:141)	at com.company.lf.product.bo.product.MaintainModule.loadData(MaintainModule.java:231)	at com.company.lf.product.ds.productlife.DataMaintainDSImpl.loadData(DataMaintainDSImpl.java:68)	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)	at java.lang.reflect.Method.invoke(Method.java:324)	at com.company.pub.framework.internal.DSProxy.invoke(DSProxy.java:98)	at $Proxy5.loadData(Unknown Source)	at com.company.lf.product.ds.productlife.DataMaintainDSDelegate.loadData(DataMaintainDSDelegate.java:52)	at com.company.lf.product.ctrl.accutor.AccutorBenefitAction.loadData(AccutorBenefitAction.java:346)	at com.company.lf.product.ctrl.accutor.AccutorBenefitAction.process(AccutorBenefitAction.java:65)	at com.company.pub.framework.GenericAction.execute(GenericAction.java:250)	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)	at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)	at com.evermind.server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:65)	at com.company.pub.framework.XssFilter.doFilter(XssFilter.java:96)	at com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.java:16)	at com.company.pub.framework.AppFilter.doFilter(AppFilter.java:83)	at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:600)	at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:317)	at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:790)	at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:208)	at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:125)	at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:192)	at java.lang.Thread.run(Thread.java:534)


分享到:
评论

相关推荐

    C#分布式事务的超时处理实例分析

    它是从Framework 2.0开始引入的一个事务管理类,在使用隐式事务时,事务完成前 程序应调用TransactionScope的Complete()方法,将事务提交,然后利用Dispose()释放事务对象。若执行期间出现错误,事务将自动回滚。 ...

    Windows 系统错误代码简单分析

    Microsoft Windows 系统错误代码简单分析:  0000 操作已成功完成。  0001 错误的函数。  0002 系统找不到指定的文件。  0003 系统找不到指定的路径。  0004 系统无法打开文件。  0005 拒绝访问。...

    loadrunner错误原因分析--错误集锦

    详细说明了loadrunner中各种错误的解决方法 Step download timeout (120 seconds) 问题描述has shut down the connection prematurely

    小结SQLServer连接失败错误及解决

    一般而言,有以下两种连接SQLServer的方式,一是利用SQLServer自带的客户端工具,如企业管理器、查询分析器、事务探查器等;二是利用用户自己开发的客户端程序,如ASP脚本、VB程序等,客户端程序中又是利用ODBC或者...

    万能数据库查询分析器《DB 查询分析器》 1.0

    3、提供了对所有数据库包括Oracle、Sybase、DB2、Informix、MySql、MS SQL SERVER、Access、FoxPro的SQL语句进行词法分析,对关键字、函数等显示以不同的颜色,使用户更方便地发现输入SQL语句的错误,同时也便于用户...

    大数据分析算法.pptx

    关联规则挖掘算法 频繁模式挖掘 频繁模式挖掘 一个经典的案例是购物篮分析,分析顾客的购物习惯。比如,顾客购买了牛奶,有多大可能也购买面包?将二者放在一起,是否会增加二者的销量。 在医疗方面,患者患有某种...

    科来网络分析系统 v4.06.172

    一个专为协议分析和网络诊断而设计的网络检测工具,主要用于网络检测、错误诊断、故障排除的维护管理。主要功能分为: 一. 检测功能 1. 实时捕获本机和局域网内的数据包,并实时解码分析,支持数据包过滤。 2. 支持...

    基于家态的多事务工作流完整性分析

    基于工作流的Pet ri 网结构化建模方法,研究了同一品质多事务工作流的Pet ri 网模型,分析了模型处理多种事务的能力,对以往研究中的不足和错误进行了补充和更正,给出了基于家态的模型结构完整性验证的一个充要条件....

    万能数据库查询分析器(DB查询分析器) v7.023.zip

    3、提供了对所有数据库包括Oracle、Sybase、DB2、Informix、MySql、MS SQL SERVER、Access、FoxPro的SQL语句进行词法分析,对关键字、函数等显示以不同的颜色,使用户更方便地发现输入SQL语句的错误,同时也便于用户...

    MYSQL事务回滚的2个问题分析

    在事务中,每个正确的原子操作都会被顺序执行,直到遇到错误的原子操作,此时事务会将之前的操作进行回滚。回滚的意思是如果之前是插入操作,那么会执行删 除插入的记录,如果之前是update操作,也会执行update操作...

    该如何解决MySQL中的死锁问题.txt

    解决MySQL中的死锁问题通常涉及多个方面,包括监控死锁、分析死锁原因、优化事务设计以及调整系统配置等。以下是一些解决MySQL中死锁问题的建议和方法: 监控死锁: 使用SHOW ENGINE INNODB STATUS命令来查看InnoDB...

    ODBC万能查询器,DB 查询分析器(经典)

    3、提供了对所有数据库包括Oracle、Sybase、DB2、Informix、MYSQL、MS SQL SERVER、Access、FoxPro的SQL语句进行词法分析,对关键字、函数等显示以不同的颜色,使用户更方便地发现输入SQL语句的错误,同时也便于用户...

    SQLServer2000高级编程技术-已添加书签,想学存储过程、SQL编程务必要看,分析非常透彻

    10.4.1 使用临时表来传递一个记录集给一个嵌套的存储过程 10.4.2 使用光标来传递一个记录集给一个嵌套的存储过程 10.5 如何处理一个存储过程的结果集 10.6 使用标识值 10.6.1 一个标准问题及解答 10.6.2 标识值与...

    解决数据库连接方法

    一般而言,有以下两种连接 SQL Server 的方式,一是利用 SQL Server 自带的客户端工具,如企业管理器、查询分析器、事务探查器等;二是利用用户自己开发的客户端程序,如ASP 脚本、VB程序等,客户端程序中又是利用 ...

    elm-review:分析Elm项目,以帮助在用户找到错误之前发现错误

    让每个人都使用一个通用的Button组件,而不是创建自己的Button组件。 帮助您创建的库的用户,避免犯一些您的API无法阻止他们执行的错误。 但是要当心如何以及为什么在项目中引入规则。 最好的方法通常是指导用户...

    管理员补办饭卡需求分析

    文档分为两个部分,第一部分基本路径,第二部分扩展路径 基本路径样例: 1.系统显示饭卡管理登录界面 2.管理员输入用户名、密码点击登录按钮 3.密码正确,系统显示饭卡管理界面 4.系统请求管理员选择事务类型 5.管理...

    loadRunner常用脚本

    lr_fail_trans_with_error/将打开事务的状态设置为LR_FAIL并发送错误消息 lr_get_trans_instance_duration/获取事务实例的持续时间(由它的句柄指定) lr_get_trans_instance_wasted_time/获取事务实例浪费的时间...

    如何在 Spring Boot 3.X 中使用 Kafka 实现消息传递功能?

    Kafka 是一个分布式流处理平台,适用于实时数据流处理、日志收集与分析、事件驱动等场景。通过集成 Kafka,我们可以实现可靠的异步消息传递,提高系统的可伸缩性和可靠性。 使用场景: Kafka 在许多应用场景中发挥着...

Global site tag (gtag.js) - Google Analytics