精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-09
最后修改:2010-05-15
结合http://www.iteye.com/topic/35907,简单总结一下自己的理解:
(上图AD和BC代表两个事务,1,2,3代表事务执行的三个阶段。图简陋了点,有点像“金箍棒”)
使用PROPAGATION_REQUIRED满足需求1,但子事务BC的rollback会无条件地使父事务AD也rollback,不能满足需求2。 使用PROPAGATION_REQUIRES_NEW满足需求2,但子事务(这时不应该称之为子事务)BC是完全新的事务上下文,父事务(这时也不应该称之为父事务)AD的成功与否完全不影响BC的提交,不能满足需求1。 同时满足上述两条需求就要用到PROPAGATION_NESTED了。PROPAGATION_NESTED在事务AD执行到B点时,设置了savePoint(关键)。 当BC事务成功commit时,PROPAGATION_NESTED的行为与PROPAGATION_REQUIRED一样。只有当事务AD在D点成功commit时,事务BC才真正commit,如果阶段3执行异常,导致事务AD rollback,事务BC也将一起rollback ,从而满足了“联合成功”。 当阶段2执行异常,导致BC事务rollback时,因为设置了savePoint,AD事务可以选择与BC一起rollback或继续阶段3的执行并保留阶段1的执行结果,从而满足了“隔离失败”。 当然,要明确一点,事务传播策略的定义是在声明或事务管理范围内的(首先是在EJB CMT规范中定义,Spring事务框架补充了PROPAGATION_NESTED),编程式的事务管理不存在事务传播的问题。 另外,SavePoint在JDBC3.0中,所以应用嵌套事务必须保证JDK1.4+和驱动对JDBC3.0的支持。 强调,补充一点:PROPAGATION_NESTED只是Spring针对JDBC3.0以上版本SavePoint机制的一个事务传播机制的扩展,J2EE体系中是没有的,所以如果应用中使用JTA作为底层的事务管理机制的话,使用Spring也是不可能支持PROPAGATION_NESTED。不过JPA的体系中好像是有SavePoint的机制(还没有细研究过),Spring应该可以在之上做相应的支持。这点有待进一步研究! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-09
请教图片如何加入到文章中?
|
|
返回顶楼 | |
发表时间:2007-05-09
你可以先把图片上传到你的个人博客空间,在这里用img标签,也可以修改一下帖子,把这个附件的下载链接放到img标签里面
|
|
返回顶楼 | |
发表时间:2007-05-09
谢谢
|
|
返回顶楼 | |
发表时间:2007-05-10
非常简单明了,感谢。
请问:怎样才能让AD事务可以选择与BC一起rollback或继续阶段3的执行并保留阶段1的执行结果? |
|
返回顶楼 | |
发表时间:2007-05-14
spiritfrog 写道 非常简单明了,感谢。
请问:怎样才能让AD事务可以选择与BC一起rollback或继续阶段3的执行并保留阶段1的执行结果? 把执行BC事务的方法try-catch起来,在catch中选择(是否继续向上抛出异常)。PROPAGATION_REQUIRED时,即使try-catch住BC的异常,AD事务也一定会被无条件rollback。 |
|
返回顶楼 | |
发表时间:2007-05-14
sharajava 写道 把执行BC事务的方法try-catch起来,在catch中选择(是否继续向上抛出异常)。PROPAGATION_REQUIRED时,即使try-catch住BC的异常,AD事务也一定会被无条件rollback。
不需要专门的操作?第2段会回滚吗? 那如果我1、2段执行成功,第3段执行失败,我要回滚到第2段执行前而第1段执行后应该怎么做呢? |
|
返回顶楼 | |
发表时间:2007-05-14
知道了,第2段事务必须是在大的方法中调用的另一个被spring事务管理的对象的方法中执行的,这样2抛异常时可以回滚到2执行前。
|
|
返回顶楼 | |
浏览 8425 次