Java 事务提交异常
我使用以下代码开始并提交事务Java 事务提交异常,java,hibernate,transactions,Java,Hibernate,Transactions,我使用以下代码开始并提交事务 final static Object lock = new Object(); @Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public String addRequest(String actionCode) throws Exception { synchronized (this.getClass
final static Object lock = new Object();
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public String addRequest(String actionCode) throws Exception {
synchronized (this.getClass()) {
Session session = dao.getCurrentSession();
try {
System.out.println("start");
Transaction tr = session.getTransaction();
tr.begin();
certRequest
.setRequestNbr(generateRequestNumber(certInsuranceRequestAddRq
.getAccountInfo().getAccountNumberId()));
reqId = Utils.getUniqueId();
certRequest.setRequestId(reqId);
ItemIdInfo itemIdInfo = new ItemIdInfo();
itemIdInfo.setInsurerId(certRequest.getRequestId());
certRequest.setItemIdInfo(itemIdInfo);
Serializable it = session.save(certRequest);
if (it != null) {
addAccountRel();
System.out.println("\n \n Transaction value is as " + it);
if (!tr.wasCommitted())
tr.commit();
System.out.println("\n \n Refresh value is "
+ generateRequestNumber(certInsuranceRequestAddRq
.getAccountInfo().getAccountNumberId()));
}
} catch (HibernateException e) {
e.printStackTrace();
} finally {
session.close();
}
System.out.println("end1");
}
return reqId;
}
然而,我得到了以下例外
org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:660)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$afterReturning$org_springframework_transaction_aspectj_AbstractTransactionAspect$3$2a73e96c(AbstractTransactionAspect.aj:82)
at com.csc.exceed.uow.RequestAddUOW.addRequest(RequestAddUOW.java:405)
at com.csc.exceed.uow.RequestAddUOW.invokeService(RequestAddUOW.java:82)
at resources.rules.uow.Rule_Add_Request_0.defaultConsequence(Rule_Add_Request_0.java:7)
at resources.rules.uow.Rule_Add_Request_0DefaultConsequenceInvoker.evaluate(Rule_Add_Request_0DefaultConsequenceInvoker.java:29)
at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:917)
at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:856)
at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1071)
at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:785)
at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:761)
at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:226)
at com.csc.exceed.infrastructure.BusinessProcessManager.executeRules(BusinessProcessManager.java:35)
at com.csc.exceed.infrastructure.BusinessProcessManager.executeUOWSequence(BusinessProcessManager.java:72)
at com.csc.exceed.controller.RequestHandler.service(RequestHandler.java:169)
at com.csc.exceed.controller.ControllerServlet.doPost(ControllerServlet.java:54)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.hibernate.TransactionException: Transaction not successfully started
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:131)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
... 32 more
error msz is Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
我也试过了
事务tr=session.beginTransaction()
代替“Transaction tr=session.getTransaction();
但这也不起作用。请建议 编写事务同步代码很困难,一旦开始将应用程序部署到多个服务器,就会失败。要解决此问题,请使用适当的方法进行交易 首先,删除所有事务和会话管理代码以及不需要的同步内容。接下来,只需使用
@Transactional(isolation=SERIALIZABLE)
注释您的方法,即可在数据库级别进行锁定,无论您拥有多少个应用程序服务器,锁定都会起作用
@Transactional(isolation=SERIALIZABLE, rollbackFor = Exception.class)
public String addRequest(String actionCode) throws Exception {
Session session = dao.getCurrentSession();
System.out.println("start");
certRequest
.setRequestNbr(generateRequestNumber(certInsuranceRequestAddRq
.getAccountInfo().getAccountNumberId()));
reqId = Utils.getUniqueId();
certRequest.setRequestId(reqId);
ItemIdInfo itemIdInfo = new ItemIdInfo();
itemIdInfo.setInsurerId(certRequest.getRequestId());
certRequest.setItemIdInfo(itemIdInfo);
Serializable it = session.save(certRequest);
if (it != null) {
addAccountRel();
System.out.println("\n \n Transaction value is as " + it);
System.out.println("\n \n Refresh value is "
+ generateRequestNumber(certInsuranceRequestAddRq
.getAccountInfo().getAccountNumberId()));
}
System.out.println("end1");
return reqId;
}
在我看来,您的代码似乎也有缺陷,因为
reqId
和certRequest
是实例变量,我没有看到它们被传递到方法中。出于某种原因,我认为您两次生成一个requestNumber
,一次在if
语句外部,一次在if
语句内部,这也是错误的。您试图创建一个新的事务,但您似乎说的是Spring来处理该事务。要么你做,要么它做
从您在帖子上的评论/链接中,我了解到您有一些肮脏的阅读,不允许您实现您想要的。您的隔离。可序列化的将在这方面帮助您
无论M.Deinum发布了什么都是正确的。不要。。。Spring正在管理事务,请从代码中删除所有事务会话管理逻辑。只需执行sessionFactory.getCurrentSession
完成你的事情,然后就可以了。这就是@Transactional
的全部要点。嗨@M.Deinum,我正在努力解决以下问题。这就是我应用事务逻辑的原因。如果我从我的代码中删除事务逻辑,你能建议一些替代解决方案吗?@pkn1230如果(it!=null){
使用@Transactional(隔离=SERIALIZABLE),你必须在的情况下添加一个roleback
。不要尝试在代码中修复此问题,因为这将始终失败,您可能可以为单个节点修复此问题,但一旦您将其部署到多台计算机上,它将不再工作。请使用数据库解决此问题。generateRequestNumber
实际上在做什么?(但在其他线程中可能更合适).Hi@M.Deinum,我已经从Java代码中删除了事务和会话逻辑。但是现在发生的是,我的一个线程执行成功,而另一个线程执行了“Hibernate-flushing”例外。毫无例外,这条评论没有多大作用……将它添加到你的问题中,或者开始一个新的问题。我在回答中表达了几个问题,你能回答这些问题吗,以及你的课程在多个层面上似乎有错吗?嗨@M.Deinum,请在没有cl的地方找到新问题以及你的问题的澄清arification.您的服务存在缺陷,因为您似乎正在保留实例状态…不要这样做。请您澄清保留“实例状态…”是什么意思?