论坛首页 Java企业应用论坛

解惑 spring 嵌套事务

浏览 159960 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-11-29  
jianfeng008cn 写道


看了这篇文章后很多人说概念上清楚了,我怎么就觉得很迷糊呢!?仔细琢磨了一下,说一下我的想法和疑惑。
我觉得上面的这种想法其实是合理的,楼主把针对持久层的事务和程序的事务是不是较在一起了呢?(当然我也怀疑是自己犯本质上的错误了)
抛开数据库来理解,如果serviceA中的methodA中有调用ServiceB methodB,如果ServiceB的methodB调用出错需要rollback,那么理所当然,该方法所做的事情都应该取消,回到调用前,即rollback本来就该是这个样子的,哪来的脏数据呢?数据库的rollback是不会有数据库脏数据生成的吧
PROPAGATION_REQUIRES_NEW 的配置当然会有脏数据问题,因为正如他的英文意思,本身就是新的事务的意思呀。
这样说来Service 调用dao的说法也有其合理性,把业务逻辑和持久层很好的分离出来从而更好的剥离业务上的事务和持久层的事务。
我现在的理解是 事务只是保证一系列操作的原子属性,按照楼主的意思我想spring是不是不能处理多数据源情况下的事务处理呢。

经验很少,还望各位不啻指教,感谢了。



呵呵, 事务就是事务, 没有什么 "业务上的事务和持久层的事务" 的说法, 建议你先看一下 http://www.iteye.com/topic/11190
0 请登录后投票
   发表时间:2006-11-29  
Feiing 写道
jianfeng008cn 写道


看了这篇文章后很多人说概念上清楚了,我怎么就觉得很迷糊呢!?仔细琢磨了一下,说一下我的想法和疑惑。
我觉得上面的这种想法其实是合理的,楼主把针对持久层的事务和程序的事务是不是较在一起了呢?(当然我也怀疑是自己犯本质上的错误了)
抛开数据库来理解,如果serviceA中的methodA中有调用ServiceB methodB,如果ServiceB的methodB调用出错需要rollback,那么理所当然,该方法所做的事情都应该取消,回到调用前,即rollback本来就该是这个样子的,哪来的脏数据呢?数据库的rollback是不会有数据库脏数据生成的吧
PROPAGATION_REQUIRES_NEW 的配置当然会有脏数据问题,因为正如他的英文意思,本身就是新的事务的意思呀。
这样说来Service 调用dao的说法也有其合理性,把业务逻辑和持久层很好的分离出来从而更好的剥离业务上的事务和持久层的事务。
我现在的理解是 事务只是保证一系列操作的原子属性,按照楼主的意思我想spring是不是不能处理多数据源情况下的事务处理呢。

经验很少,还望各位不啻指教,感谢了。



呵呵, 事务就是事务, 没有什么 "业务上的事务和持久层的事务" 的说法, 建议你先看一下 http://www.iteye.com/topic/11190


非常感谢,收获不小,继续努力!
0 请登录后投票
   发表时间:2006-11-29  
J2EE规范不要求应用服务器支持嵌套事务,也就是说,要使用嵌套事务,就不能用JtaTransactionManager,就不能支持分布式事务,对吗?
0 请登录后投票
   发表时间:2006-11-29  
lithium 写道
J2EE规范不要求应用服务器支持嵌套事务,也就是说,要使用嵌套事务,就不能用JtaTransactionManager,就不能支持分布式事务,对吗?


是的, PROPAGATION_NESTED 在 EJB 中不要求实现, 能不能使用要看 JTA 的具体实现
引用

Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else. There is no analogous feature in EJB.

Note: Actual creation of a nested transaction will only work on specific transaction managers. Out of the box, this only applies to the JDBC DataSourceTransactionManager when working on a JDBC 3.0 driver. Some JTA providers might support nested transactions as well.
0 请登录后投票
   发表时间:2006-12-14  
使用嵌套事务是有前提的,就是该嵌套事务可能需要做分支处理。否则用
PROPAGATION_REQUIRED 就足够了,如果子事务有异常,直接回滚。
0 请登录后投票
   发表时间:2006-12-14  
决定是精华的好贴,顶起来
0 请登录后投票
   发表时间:2006-12-20  
非常好的分析,期待更多文章
0 请登录后投票
   发表时间:2006-12-26  
经典,分析的很好
0 请登录后投票
   发表时间:2006-12-28  
经典好文,以前在项目中使用过PROPAGATION_NEW,看了楼主的文章,对PROPAGATION_NESTED有了比较明确的认识。
0 请登录后投票
   发表时间:2007-01-21  

引用

Feiing 写道
是的, 但是关键在于选择 PROPAGATION_REQUIRES_NEW 时 ServiceB.methodB 没办法回滚到它执行之前的 SavePoint, 这时已经产生了一些脏数据, 而这些脏数据将可能导致后面的程序执行出错, 所以 SavePoint 是潜套事务的核心概念, 也是使用嵌套事务的必要前提



Feiing 能不能就这个savepoint 举个情景,因为我也有这个疑问: ServiceB.methodB 没办法回滚到它执行之前的 SavePoint, 这时已经产生了一些脏数据  ???怎样的情形产生脏数据?
0 请登录后投票
论坛首页 Java企业应用版

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