论坛首页 Java企业应用论坛

service调用的存储过程里显式commit,而导致事务不能rollback

浏览 12492 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-28  
程序用的spring声明式事务管理
开始事务使用正常,后来发现一个service method事务出错,其操作如下
1.create obj1
2.调用obj2 的method 来执行存储过程sp
3.create obj3
发现在第3步出错时,第1步的操作没有rollback

检查后发现是由于第2步调用的存储过程里显式commit了
我理解为整个method是在一个事务里,第2步sp commit后之前的结果就不能rollback了
代码里去掉第2步的sp调用后,第3步出错可以正常rollback

我试过打开事务嵌套不行
<property name="nestedTransactionAllowed" value="true"/>


请问能不能通过spring配置的方式让存储过程里的commit不影响外层事务,谢谢!
由于sp很多,不知道去掉里面的commit会不会有其它影响,所以先考虑spring配置

另外请问一般sp编写时最后都会加上commit吗,这样岂不是很容易对调用它的外层事务产生影响。
   发表时间:2007-04-28  
把存储过程放在事务之外。。。
不用spring进行管理
默认他内部不会出错
0 请登录后投票
   发表时间:2007-04-28  
抛出异常的爱 写道
把存储过程放在事务之外。。。
不用spring进行管理
默认他内部不会出错

这样出错后第1和第3步rollback,第2步却commit了
事务就不完整了
0 请登录后投票
   发表时间:2007-04-28  
不知道您的spring+hibernate是怎么结合使用的,不知道这种思路是否可以满足您的需要:
Service Layer:
  创建Session
   打开事务
  getSession

web Layer:
    BaseAction:doExecute(....)The abstract for action's execute
       try{
           如果没有RuntimeException发生:
                    commit = true;
             否则。。。。
       }catch(Exception e){
            throw e
       }finally{
            if commit try ut.commit()
                  if exeption occur rollback
            else rollback
       }
0 请登录后投票
   发表时间:2007-04-28  
可以给事务取个别名嘛,然后commit的时候按名字来提交
0 请登录后投票
   发表时间:2007-04-28  
借这个主题,记得以前JAVAEYE有一个帖子,问题是,如果我通过Hibernate来调用一个native sql,而这个native sql执行了一个存储过程,这个事务是否会回滚?
0 请登录后投票
   发表时间:2007-04-28  
blu3leaf 写道
可以给事务取个别名嘛,然后commit的时候按名字来提交

你是说在存储过程里只commit存储过程本身的事务?
那如何rollback呢?还是有3楼的问题啊
0 请登录后投票
   发表时间:2007-04-29  
只有存储过程中不commit,才能保证3个操作在一个事务中处理。
0 请登录后投票
   发表时间:2007-04-29  
调用存储过程会单独使用一个local transaction。所以他会提交。同时又不在外部事务的控制之下,于是就无法回滚。
0 请登录后投票
   发表时间:2007-04-29  
jncz 写道
调用存储过程会单独使用一个local transaction。所以他会提交。同时又不在外部事务的控制之下,于是就无法回滚。

不是单独使用一个local transaction,因为第2步的sp commit造成第1步的操作也不能rollback了
这就说明sp与其它操作是在一个事务里。

目前看来似乎只能修改sp去掉显式commit了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics