在我们的应用程序中,我们使用Hibernate 3。最近我在交易中遇到了一个问题。我有一些代码如下方式
method1()
try{
tx = session.beginTransaction();
//New object which needs to be stored
session.save(object);
// Some code which generates exception
tx.commit(); // Exception occured before commit processing
}catch(Exception ex){
e.printStackTrace();
throw e;
}finally{
if(tx!=null && tx.wasNotCommited()){
tx.rollback();
}
}
我有另一个与此相同的方法,即使该方法抛出异常,也会在该方法之后调用该方法。
两个方法的会话是相同的。
现在我所经历的是,如果我的第二个方法成功执行并提交hibernate事务,这将存储我不想要的保存在第一个方法中的数据。
我无法分享确切的代码,但我准备了一个与此问题类似的测试方法。我的数据库服务器是mysql。
package com.opshub.jobs.core;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.opshub.dao.core.Company;
import com.opshub.utils.hibernate.HibernateSessionFactory;
public class Test {
public static void main(String[] args) throws Exception{
Session session = HibernateSessionFactory.openSession();
try{
Transaction tx = session.beginTransaction();
try{
Company company = new Company();
company.setName("Gaurav");
company.setCompanyDetails("IT Company");
company.setCompanyAddress("India");
session.save(company);
if(true)
throw new Exception("Now go to finally");
tx.commit();
}catch(Exception e){
throw e;
}finally{
tx.rollback();
}
}finally{
Transaction tx = session.beginTransaction();
tx.begin();
Company company = new Company();
company.setName("Gaurav 1");
company.setCompanyDetails("IT Company");
company.setCompanyAddress("India");
session.save(company);
// if(true)
// throw new Exception("Now go to finally");
tx.commit();
}
}
}
任何帮助都将不胜感激。
最后,我找到了这个问题的解决方案。在开始另一个事务/操作之前,您可以使用session.clear()从会话中删除所有挂起的保存/更新/删除操作。
所以在最后的回滚中,只需添加session.save()。
感谢您的回复。
我正在使用Spring(3.1.4版本)和HibernateTemplate(3.6.7.Final)以及Spring数据JPA(1.3.0版本)。我在配置文件中定义了两个事务管理器,一个用于Hibernate,另一个用于Spring数据JPA。两个事务管理器使用不同的数据源。 我想在代码中使用Hibernate的事务管理器和Spring data JPA的事务管理器。(Spring文档链接-10
I want to tell you two stories from my career which I think are classic illustrations of the difference between tech companies that are well-managed and tech companies that are disasters. It comes dow
支持项 支持数据分片后的跨库事务; 两阶段提交保证操作的原子性和数据的强一致性; 服务宕机重启后,提交/回滚中的事务可自动恢复; 支持同时使用 XA 和非 XA 的连接池。 不支持项 服务宕机后,在其它机器上恢复提交/回滚中的数据。
XAShardingSphereTransactionManager 为A pache ShardingSphere 的分布式事务的 XA 实现类。 它主要负责对多数据源进行管理和适配,并且将相应事务的开启、提交和回滚操作委托给具体的 XA 事务管理器。 开启全局事务 收到接入端的 set autoCommit=0 时,XAShardingSphereTransactionManager 将调用具
两阶段事务提交采用的是 X/OPEN 组织所定义的DTP模型所抽象的 AP(应用程序), TM(事务管理器)和 RM(资源管理器) 概念来保证分布式事务的强一致性。 其中 TM 与 RM 间采用 XA 的协议进行双向通信。 与传统的本地事务相比,XA 事务增加了准备阶段,数据库除了被动接受提交指令外,还可以反向通知调用方事务是否可以被提交。 TM 可以收集所有分支事务的准备结果,并于最后进行原子提
我正在计划一个设计,我将从同一个池中获得两个连接(plocal)。仅在一个连接上启动事务,而不在另一个连接上启动事务。我希望在同一过程中使用这两个数据库连接,并使用非事务连接进行模式调用,使用事务连接进行支持事务的记录级调用。这种方法有效吗?