论坛首页 Java企业应用论坛

解惑 spring 嵌套事务

浏览 159961 次
该帖已经被评为精华帖
作者 正文
   发表时间:2007-01-21  
引用

PROPAGATION_REQUIRES_NEW starts a new, independent "inner" transaction for the given scope. This transaction will be committed or rolled back completely independent from the outer transaction, having its own isolation scope, its own set of locks, etc. The outer transaction will get suspended at the beginning of the inner one, and resumed once the inner one has completed.


引用
它起到了分支执行的效果, 如果 ServiceB.methodB 失败, 那么执行 ServiceC.methodC(), 而 ServiceB.methodB 已经回滚到它执行之前的 SavePoint, 所以不会产生脏数据(相当于此方法从未执行过), 这种特性可以用在某些特殊的业务中, 而 PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRES_NEW 都没有办法做到这一点.


我知道怎么表述我的疑问了,就是requires_new 中的"inner" 事务的回滚对外面事务的影响. 如果是对同一个resource的操作(或者同时有别的resource),我在ServiceB.methodB中进行回滚,那么其回滚的范围也只在"inner"的事务之中的话,不也可以达到那么nested 事务所说的分支执行的效果?
0 请登录后投票
   发表时间:2007-01-30  
对于楼主说的:‘选择 PROPAGATION_REQUIRES_NEW 时 ServiceB.methodB 没办法回滚到它执行之前的 SavePoint, 这时已经产生了一些脏数据, 而这些脏数据将可能导致后面的程序执行出错’。有疑问,用PROPAGATION_REQUIRES_NEW时在"inner"事务中回滚怎么会产生脏数据呢?它也是回滚到方法执行以前呀!我感觉只有在"inner"事务完成了也就是commit过以后,外层事务又rollback掉了才会可能产生所谓的脏数据。
0 请登录后投票
   发表时间:2007-02-11  
我的理解,
nested 可以在外层rollback所有内层的事务。
requiresnew 不行。
0 请登录后投票
   发表时间:2007-02-11  
非常好,加入收藏。
0 请登录后投票
   发表时间:2007-02-12  
MS我需要第8种配置
Service A{
   doA(){
     xxxxxxx;
     b.doB();
   }
}


doB是很消耗时间的操作
如果我需要在执行完XXXXX以后就commit(减少锁表时间)呢?
0 请登录后投票
   发表时间:2007-03-28  
分析的太棒了。
0 请登录后投票
   发表时间:2007-03-28  
好文,看了lz和跟贴的讨论,终于理解了
0 请登录后投票
   发表时间:2007-04-09  
有点疑问没弄明白,就是嵌套事务回退是怎么处理的?
是由数据库自动实现不需要自己写代码了吧?
在sqlserver2000中:ROLLBACK TRAN语句总是属于最外层的事务,并且因此总是回滚整个事务而不论其中打开了多少嵌套事务
0 请登录后投票
   发表时间:2007-04-11  
很棒的分析,以前对事务的传播一直不明白,要谢谢楼主
0 请登录后投票
   发表时间:2007-04-12  
真是好文,看了才明白为什么EJB中的事务配置是6种,而spring的是7种。
EJB3.0也应该加上这第7种啊
0 请登录后投票
论坛首页 Java企业应用版

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