在我们的应用程序中,我们使用 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();
}
}
我有另一个与此相同的方法,即使在该方法抛出异常的情况下也会在该方法之后调用该方法。
这两种方法的 session 是相同的。
现在我遇到的是,如果我的第二个方法成功执行并提交 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 中删除所有挂起的保存/更新/删除操作。
所以在最后回滚时,只需添加 session.save() 即可。
感谢您的回复。
关于java - Hibernate 3 的两个事务问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27014249/