当前位置: 代码迷 >> Java Web开发 >> 批处理存储过程的事务管理,该如何解决
  详细解决方案

批处理存储过程的事务管理,该如何解决

热度:220   发布时间:2016-04-16 21:43:09.0
批处理存储过程的事务管理
删除多条页面数据,存储过程是删除一条数据的逻辑,所以在java代码中,我使用循环执行该存储过程。
........
int result= (Integer)this.getHibernateTemplate().execute(new HibernateCallback() {

@Override
public Object doInHibernate(Session session) throws HibernateException,
SQLException {

//Transaction tx = session.beginTransaction();
for(int i = 0; i < idArr.length; i++){
                        //执行存储过程,删除一条数据 start
int index = 1;
ProcPara[] paras = new ProcPara[]{
new ProcPara(index ++, ProcPara.IN, 1, Types.INTEGER),
new ProcPara(index ++, ProcPara.IN, idArr[i], Types.VARCHAR),
new ProcPara(index ++, ProcPara.IN, userAccount, Types.VARCHAR),
new ProcPara(index ++, ProcPara.OUT, Types.INTEGER),
new ProcPara(index ++, ProcPara.OUT, Types.VARCHAR)
};
callStoredProcedure(produrename, paras);
                                          //执行存储过程,删除一条数据 end
}

return 0;
}

});
.........

我的问题是如何对这个循环执行的存储过程添加hibernate事务管理,一般情况下是这样
Transaction tx =null;
try{
tx = session.beginTrasaction();
//数据库访问操作
......
tx.commit();
}cation(Exception e){
if(tx != null){
tx.roolback();
}
throw e;
}finally{
tx.close();
}
如果在上面的数据库操作中加入我的循环逻辑,我试了一下好像不靠谱,每条存储过程执行中里面就有事务和异常处理,我想我的catch应该什么异常也抓不到。我只能认为如果存储过程返回结果集中的result为0则发生了异常。综上,我不知道如何在一条删除操作(由存储过程编实现)出现异常时,将已执行的roolback.
------解决思路----------------------
在哪里开启事务,那就在同一级别进行异常处理/回滚/提交/资源关闭. 楼主是否考虑需要把事务对象从上一层调用的地方作为参数传进来,这样多个循环就是同一个事务,而不是多个事务.
另外, delete 为什么会有异常,这逻辑上说不通.除非有语法错误,或者连接断开.
------解决思路----------------------
是不是这个意思,你看看。 
------解决思路----------------------
同一个连接,加事务应该是可以的啊?