如果一个事务在多个事务中失败到不同的表,那么在hibernate中是否可以回滚?

时间:2014-10-10 07:04:49

标签: java hibernate

我有一种方法:

    // methods
    private void transform(TransformList transformList) {
    TableA tA = transformList.getTableA();
    TableB tB = transformList.getTableB();
    TableC tC = transformList.getTableC();

    daoObj.saveA(tA);
    daoObj.saveB(tB);
    daoObj.saveC(tC);
    }

现在,

    //saveA mehtod
    public void saveA(TableA tA)  {
    Session session = Context.getHibernateSession();
    try {
    if(session != null) {
    Transaction tx = session.beginTransaction();
    tx.begin();
    session.merge(tA);
    tx.commit();
    }

    }catch (Exception e) {
    tx.rollback();
    throw new SomeException(e.getMessage());
    }
    finally{
    if (session != null) {
    session.clear();
    }
    }
    }

类似地,

    //saveB mehtod
    public void saveB(TableB tB)  {
    Session session = Context.getHibernateSession();
    try {
    if(session != null) {
    Transaction tx = session.beginTransaction();
    tx.begin();
    session.merge(tB);
    tx.commit();
    }       
    }catch (Exception e) {
    tx.rollback();
    throw new SomeException(e.getMessage());
    }
    finally{
    if (session != null) {
    session.clear();
    }
    }
    }

        //saveC mehtod
        public void saveC(TableC tC)  {
        Session session = Context.getHibernateSession();
        try {
        if(session != null) {
        Transaction tx = session.beginTransaction();
        tx.begin();
        session.merge(tC);
        tx.commit();
        }       
        }catch (Exception e) {
        tx.rollback();
        throw new SomeException(e.getMessage());
        }
        finally{
        if (session != null) {
        session.clear();
        }
        }
        }

现在在调用'转换'方法,如果saveA和saveB方法都成功然后一些 saveC方法发生异常,是否可以回滚TableA和TableB记录 (已经提交)以及TableC记录?

1 个答案:

答案 0 :(得分:2)

没有。您将事务处理至少提高一级:创建事务,并在该事务中调用saveA(),saveB()和saveC()。不要处理保存方法中的事务。

当然,这只是一种可能性。像Spring这样的框架可以极大地帮助您管理交易。