spring事务传播特性与内部事务回滚问题

spring事务传播特性与内部事务回滚问题

前提:同一个类,内部方法调用不走代理,spring基于注解的事务是基于代理的,不走代理,被调用的方法就不受事务管理代码的控制。
原理:

1、<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="globalRollbackOnParticipationFailure" value="false" /> </bean>
内外两个方法都加有事务,当内部方法在执行的过程中捕获一个异常,则内部方法执行结束后,外部方法在提交事务的时候会报Transaction has been rolled back because it has been marked as rollback 异常。这是因为内部方法在捕获异常后,会将当前事务标记为rollback-only,这样,在外部事务在提交的时候就会报这个异常。通过设置isGlobalRollbackOnParticipationFailure为false,让主事务决定回滚,如果当遇到exception加入事务失败时,调用者能继续在事务内决定是回滚还是继续。但是要注意这样做仅仅适用于在数据访问失败的情况下且只要所有操作事务能提交。
2、spring事务传播特性之默认传播特性REQUIRED:在执行当前方法前,如果存在一个事务就支持当前事务,如果没有,则开启,如果内部方法回滚,则会抛出上述异常
3、spring事务传播特性之NOT_SUPPORTED:当前方法不需要事务,如果方法已经在一个事务中,则将该事务挂起,当方法执行结束后,再恢复事务
4、spring事务传播特性之REQUIRES_NEW:表示当前方法需要一个新的事务,如果当前已经存在一个事务,则将当前事务挂起,并重新开启一个事务来执行当前方法,当前方法执行结束后,再将原来的事务恢复
5、spring事务传播特性之MANDATORY:当前方法只能在一个已经存在的事务中执行,不能自己发起事务;当不存在一个已有的事务时,则报异常
6、spring事务传播特性之SUPPORTS:如果当前存在事务,则在事务中进行,如果没有,就不在事务中进行
7、spring事务传播特性之NEVER:只能在没有事务的情况下运行,如果存在事务就抛出异常
8、spring事务传播特性之NESTED:该属性指定,如果业务方法在一个既有的事务中执行,则该业务方法将在一个嵌套的事务中进行;否则,按照REQUEIRED来对待。它使用一个单独的事务,这个事务可以有多个rollback点,内部事务的rollback对外部事务没有影响,但外部事务的rollback会导致内部事务的rollback。这个行为只对DataSourceTransactionManager有效,当一个方法被标记NESTED以后,会创建savepoint,走新的代理拦截流程,失败后事务会回滚到我们保存的savepoint

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值