下面是我在开发中遇到一个事务使用错误案例
try { 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(); 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丢掉了异常.
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)
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)
分享到:
相关推荐
它是从Framework 2.0开始引入的一个事务管理类,在使用隐式事务时,事务完成前 程序应调用TransactionScope的Complete()方法,将事务提交,然后利用Dispose()释放事务对象。若执行期间出现错误,事务将自动回滚。 ...
Microsoft Windows 系统错误代码简单分析: 0000 操作已成功完成。 0001 错误的函数。 0002 系统找不到指定的文件。 0003 系统找不到指定的路径。 0004 系统无法打开文件。 0005 拒绝访问。...
详细说明了loadrunner中各种错误的解决方法 Step download timeout (120 seconds) 问题描述has shut down the connection prematurely
一般而言,有以下两种连接SQLServer的方式,一是利用SQLServer自带的客户端工具,如企业管理器、查询分析器、事务探查器等;二是利用用户自己开发的客户端程序,如ASP脚本、VB程序等,客户端程序中又是利用ODBC或者...
3、提供了对所有数据库包括Oracle、Sybase、DB2、Informix、MySql、MS SQL SERVER、Access、FoxPro的SQL语句进行词法分析,对关键字、函数等显示以不同的颜色,使用户更方便地发现输入SQL语句的错误,同时也便于用户...
关联规则挖掘算法 频繁模式挖掘 频繁模式挖掘 一个经典的案例是购物篮分析,分析顾客的购物习惯。比如,顾客购买了牛奶,有多大可能也购买面包?将二者放在一起,是否会增加二者的销量。 在医疗方面,患者患有某种...
一个专为协议分析和网络诊断而设计的网络检测工具,主要用于网络检测、错误诊断、故障排除的维护管理。主要功能分为: 一. 检测功能 1. 实时捕获本机和局域网内的数据包,并实时解码分析,支持数据包过滤。 2. 支持...
基于工作流的Pet ri 网结构化建模方法,研究了同一品质多事务工作流的Pet ri 网模型,分析了模型处理多种事务的能力,对以往研究中的不足和错误进行了补充和更正,给出了基于家态的模型结构完整性验证的一个充要条件....
3、提供了对所有数据库包括Oracle、Sybase、DB2、Informix、MySql、MS SQL SERVER、Access、FoxPro的SQL语句进行词法分析,对关键字、函数等显示以不同的颜色,使用户更方便地发现输入SQL语句的错误,同时也便于用户...
在事务中,每个正确的原子操作都会被顺序执行,直到遇到错误的原子操作,此时事务会将之前的操作进行回滚。回滚的意思是如果之前是插入操作,那么会执行删 除插入的记录,如果之前是update操作,也会执行update操作...
解决MySQL中的死锁问题通常涉及多个方面,包括监控死锁、分析死锁原因、优化事务设计以及调整系统配置等。以下是一些解决MySQL中死锁问题的建议和方法: 监控死锁: 使用SHOW ENGINE INNODB STATUS命令来查看InnoDB...
3、提供了对所有数据库包括Oracle、Sybase、DB2、Informix、MYSQL、MS SQL SERVER、Access、FoxPro的SQL语句进行词法分析,对关键字、函数等显示以不同的颜色,使用户更方便地发现输入SQL语句的错误,同时也便于用户...
10.4.1 使用临时表来传递一个记录集给一个嵌套的存储过程 10.4.2 使用光标来传递一个记录集给一个嵌套的存储过程 10.5 如何处理一个存储过程的结果集 10.6 使用标识值 10.6.1 一个标准问题及解答 10.6.2 标识值与...
一般而言,有以下两种连接 SQL Server 的方式,一是利用 SQL Server 自带的客户端工具,如企业管理器、查询分析器、事务探查器等;二是利用用户自己开发的客户端程序,如ASP 脚本、VB程序等,客户端程序中又是利用 ...
让每个人都使用一个通用的Button组件,而不是创建自己的Button组件。 帮助您创建的库的用户,避免犯一些您的API无法阻止他们执行的错误。 但是要当心如何以及为什么在项目中引入规则。 最好的方法通常是指导用户...
文档分为两个部分,第一部分基本路径,第二部分扩展路径 基本路径样例: 1.系统显示饭卡管理登录界面 2.管理员输入用户名、密码点击登录按钮 3.密码正确,系统显示饭卡管理界面 4.系统请求管理员选择事务类型 5.管理...
lr_fail_trans_with_error/将打开事务的状态设置为LR_FAIL并发送错误消息 lr_get_trans_instance_duration/获取事务实例的持续时间(由它的句柄指定) lr_get_trans_instance_wasted_time/获取事务实例浪费的时间...
Kafka 是一个分布式流处理平台,适用于实时数据流处理、日志收集与分析、事件驱动等场景。通过集成 Kafka,我们可以实现可靠的异步消息传递,提高系统的可伸缩性和可靠性。 使用场景: Kafka 在许多应用场景中发挥着...