spring事务----控制事务成功失败(Transaction marked as rollback)
问题:
项目采用是三层架构,在service层配置了spring的事务,项目中出现了A类的service层的某个方法中调用B类service层的对象方法,然而部署在tomcat中,执行操作,抛出“Transaction marked as rollback”异常。
解决办法:
原因就是:B类中方法被A类中的方法调用后,B类方法的事务已经提交,但是spring却把B类方法的事务标记为rollback-only,A类方法的外层事务管理器再commit时就会抛此异常,解决方法是添加红色标记的代码。如下:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="globalRollbackOnParticipationFailure" value="false" />
</bean>
原理:
在 org.springframework.transaction.support.AbstractPlatformTransactionManager 中有个叫isGlobalRollbackOnParticipationFailure的参数,默认是true.
如果isGlobalRollbackOnParticipationFailure为false,则会让主事务决定回滚,如果当遇到exception加入事务失败时,调用者能继续在事务内决定是回滚还是继续。
参考文章:http://jsczxy2.iteye.com/blog/1773795

浙公网安备 33010602011771号