我有一个函数 利用hibernate做持久层处理
处理的东西很多 我就分成了三个方法
要求是 任何一个方法中出现问题 整个数据都回滚 我该怎样做
大概写个模型 但是这样实现函数内的更新已经写进数据库了public boolean function1(){
Session session = dbDao.getHibernateTemplate().getSessionFactory()
.openSession();
Transaction tx = session.beginTransaction();
try {
//省略部分处理代码
session.update(obj);
//省略部分处理代码
this.function2(session);
//省略部分处理代码
session.update(obj);
//省略部分处理代码
session.flush();
tx.commit();
return true;
} catch (Exception e) {
tx.rollback();
return false;
} finally {
session.close();
}
}
public boolean function2(Session session){
try {
//省略部分处理代码
session.update(obj);
//省略部分处理代码
this.function2(session);
//省略部分处理代码
session.update(obj);
//省略部分处理代码
session.flush();
}
}大概就是这样 现在的情况是 一旦在function1中出现异常 function1中操作的数据能回滚 function2中的操作已经进入数据库了

解决方案 »

  1.   

    别在函数里做更新试试,直接在try里面做
      

  2.   

    这个时候就体现spring管理事务的优越性了
      

  3.   

    function2里面的 session.flush();去掉不行吗?
      

  4.   

    session.flush();
     把这两个都去掉看一下
      

  5.   

    public boolean function2(Session session,Transaction tx ){
        try {
                //省略部分处理代码
                session.update(obj);
                //省略部分处理代码
                this.function2(session);
                //省略部分处理代码
                session.update(obj);
                //省略部分处理代码
                session.flush();
        }
         catch (Exception e) {
                tx.rollback();
                return false;
            } 
    }改成这样试一下
      

  6.   


    这个肯定不行 我有可能是在function1中产生的错误 我需要function2也会滚
      

  7.   

    已经解决 我把需要更新数据库的操作都拿到function1中作 function2将要操作的实例传到外面