【问题标题】:two transaction issue with Hibernate 3Hibernate 3 的两个事务问题
【发布时间】:2014-11-19 10:16:50
【问题描述】:

在我们的应用程序中,我们使用的是 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();
    }
    }

我还有一个和这个一样的方法,即使这个方法抛出异常也会在这个方法之后调用。

两种方法的会话相同。

现在我遇到的是,如果我的第二种方法成功执行并提交休眠事务,这将存储已保存在第一种方法中的我不想要的数据。

我不能分享确切的代码,但准备了一个类似于这个问题的测试方法。我的数据库服务器是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();
        }
    }

}

任何帮助将不胜感激。

【问题讨论】:

  • 你从哪里调用第二种方法?从执行方法 1 后粘贴的代码中,即使在调用第二个方法之前,它也会提交方法 1 中的更改。
  • 在提交事务是method1之前,如果抛出异常,它如何将数据保存在我的数据库中?两种方法都比较简单,调用者类是从try中执行method1,从finally中执行method2。
  • 提交事务后关闭会话,我认为这就是为什么第二种方法存储第一种方法存储的数据的原因。

标签: java hibernate hibernate3


【解决方案1】:

我终于找到了解决这个问题的方法。在开始另一个事务/操作之前,您可以使用 session.clear() 从会话中删除所有挂起的保存/更新/删除操作。

所以在最后回滚时,只需添加 session.save()。

感谢您的回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2012-04-28
    • 2011-01-07
    • 1970-01-01
    • 2015-04-28
    • 2014-02-02
    • 1970-01-01
    相关资源
    最近更新 更多