精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-28
开始事务使用正常,后来发现一个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吗,这样岂不是很容易对调用它的外层事务产生影响。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-28
把存储过程放在事务之外。。。
不用spring进行管理 默认他内部不会出错 |
|
返回顶楼 | |
发表时间:2007-04-28
抛出异常的爱 写道 把存储过程放在事务之外。。。
不用spring进行管理 默认他内部不会出错 这样出错后第1和第3步rollback,第2步却commit了 事务就不完整了 |
|
返回顶楼 | |
发表时间: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 } |
|
返回顶楼 | |
发表时间:2007-04-28
可以给事务取个别名嘛,然后commit的时候按名字来提交
|
|
返回顶楼 | |
发表时间:2007-04-28
借这个主题,记得以前JAVAEYE有一个帖子,问题是,如果我通过Hibernate来调用一个native sql,而这个native sql执行了一个存储过程,这个事务是否会回滚?
|
|
返回顶楼 | |
发表时间:2007-04-28
blu3leaf 写道 可以给事务取个别名嘛,然后commit的时候按名字来提交
你是说在存储过程里只commit存储过程本身的事务? 那如何rollback呢?还是有3楼的问题啊 |
|
返回顶楼 | |
发表时间:2007-04-29
只有存储过程中不commit,才能保证3个操作在一个事务中处理。
|
|
返回顶楼 | |
发表时间:2007-04-29
调用存储过程会单独使用一个local transaction。所以他会提交。同时又不在外部事务的控制之下,于是就无法回滚。
|
|
返回顶楼 | |
发表时间:2007-04-29
jncz 写道 调用存储过程会单独使用一个local transaction。所以他会提交。同时又不在外部事务的控制之下,于是就无法回滚。
不是单独使用一个local transaction,因为第2步的sp commit造成第1步的操作也不能rollback了 这就说明sp与其它操作是在一个事务里。 目前看来似乎只能修改sp去掉显式commit了 |
|
返回顶楼 | |