JPA出现Transaction marked as rollback only异常 总结

总结:一个事务方法A调用另一个事务方法B时,B如果报错事务就已经是回滚状态了,放回到A之后,A方法继续执行,提交了事务(已经是回滚状态的事务),就报错了 Transaction marked as rollback only。


参考如下:

JPA出现Transaction marked as rollback only异常http://www.mzone.cc/article/571.html

摘抄:应该是事务被提交了两次导致的错误。再仔细查看代码发现是在service中嵌套调用了另外一个service的更新操作,从而导致了事务被两次提交。spring在处理事务时,多个service嵌套调用时使用的都是同一个事务,而不是每个不同的方法都使用新事务

spring的事务中程序控制事务成功失败(Transaction marked as rollback)http://jsczxy2.iteye.com/blog/1773795


A方法之外加有事务管理拦截器,在A方法中做一系列操作,操作过程中捕获了一个异常,因为此异常不影响业务,捕获后需要正常向下运行,最终事务管理器提交事务时报了如下错误

Transaction has been rolled back because it has been marked as rollback 
原因就是发生异常后当前的事务就被标记为rollback-only,外层事务管理器再commit时就会抛此异常,解决方法是
<bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref bean="sessionFactory" />
  </property>
  <property name="globalRollbackOnParticipationFailure" value="false" />
 </bean>

在 org.springframework.transaction.support.AbstractPlatformTransactionManager 中有个叫

isGlobalRollbackOnParticipationFailure的参数,默认是true.

源码中说明:

Switch this to "false" to let the transaction originator make the rollback decision. If a participating transaction fails with an exception, the caller can still decide to continue with a different path within the transaction. However, note that this will only work as long as all participating resources are capable of continuing towards a transaction commit even after a data access failure: This is generally not the case for a Hibernate Session, for example; neither is it for a sequence of JDBC insert/update/delete operations.

 

大意是:如果isGlobalRollbackOnParticipationFailure为false,则会让主事务决定回滚,如果当遇到exception加入事务失败时,调用者能继续在事务内决定是回滚还是继续。然而,要注意是那样做仅仅适用于在数据访问失败的情况下且只要所有操作事务能提交。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用@Transactional注解是用来控制事务的行为。根据引用,如果将@Transactional注解放在private方法上,Spring Boot将会忽略它,因为只有public方法才会被Spring Boot的事务管理器所代理。 对于一个标记了@Transactional注解的方法,Spring Boot的实现可能如引用所述。当调用这个被标记的方法时,Spring Boot会在方法执行之前创建一个新的事务,然后执行方法的逻辑,如果方法执行成功,则在方法返回后提交事务,如果方法执行过程中抛出异常,则在捕获到异常后回滚事务。 在使用@Transactional注解时,还可以指定传播级别。根据引用,如果使用SUPPORTS传播级别,Spring首先会检测是否存在已经存在的事务,如果存在,则在该事务中执行方法,如果不存在事务,则不会开启新的事务。 总之,@Transactional注解是用来控制方法的事务行为的。它可以标记在public方法上,并可以通过设置传播级别来决定事务的行为。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Boot JPAtransaction的使用](https://blog.csdn.net/superfjj/article/details/104689037)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值