`
yongguang423
  • 浏览: 112068 次
  • 性别: Icon_minigender_1
  • 来自: 山东
社区版块
存档分类
最新评论

Transaction rolled back because it has been marked as rollback-only异常解决

 
阅读更多

原来是这样设置的:

 

 

 <tx:attributes>

            <tx:method name="*" read-only="true"/>

        </tx:attributes>
 

 

发现selectA调用selectB,如果selectB抛出Exception,selectA中捕获Exception但是并不继续向外抛出,最后会出现错误。

 

Transaction rolled back because it has been marked as rollback-only

纠其原理其实很简单,在selectB返回的时候,transaction被设置为rollback-only了,但是selectA正常消化掉,没有继续向外抛。

那么selectA结束的时候,transaction会执commit操作,但是 transaction已经被设置为 rollback-only了。

所以会出现这个错误。

有的同学说了,那不是没得搞了,service不能抛出异常,或者不能拦截异常了?

其实不然,其实错误不在这里,而是select这种操作为什么要启动事务呢?

调整好问题,找解决方案,问题就出现在 propagation="REQUIRED"这个属性上。

标准文档上这样写:

MANDATORY  
          Support a current transaction, throw an exception if none exists.
NESTED  
          Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else.
NEVER  
          Execute non-transactionally, throw an exception if a transaction exists.
NOT_SUPPORTED  
          Execute non-transactionally, suspend the current transaction if one exists.
REQUIRED  
          Support a current transaction, create a new one if none exists.
REQUIRES_NEW  
          Create a new transaction, suspend the current transaction if one exists.
SUPPORTS  
          Support a current transaction, execute non-transactionally if none exists.

 

看来我们需要如下修改:

 

 

 <tx:attributes>

            <tx:method name="*" read-only="true" propagation="NOT_SUPPORTED"/>

        </tx:attributes>
 

这样select这样的检索操作根本就不启动事务了,而且在有事务的方法中也是可以正常调用select方法的。

现在就没问题了。

但 是现在出现了另外一个问题,就是,如果在一个事物内对db进行操作,然后在出事物之前对刚才db操作的数据进行select是获取不到修改结果的,为什么 呢?因为not——supported是会在执行select之前挂起原有事物,不在原有事物内,当然无法获得修改后的数据。

怎么办?改成supports:

 

  

     <tx:attributes>

            <tx:method name="*" read-only="true" propagation="SUPPORTS"/>

        </tx:attributes>
 

 

这个状态用一句话概括就是“有则加入事物,无也不创建事物”。

分享到:
评论
1 楼 sunhao_java 2012-06-01  
[align=right][color=red][list]
[*]          [/u][u][/u][u][/u][u][/u][u]
  • [*]
  • [*]
  • [*]
  • [*]
  • [*]
  • [*]
  • [*]
  • [*]
[/list][img][/img][url][/url][flash=200,200][/flash]
[/color][size=large][/size]
[/align]

相关推荐

    springboot2.0.3+activiti.5.22.0+oracle在线流程设计器(Activiti-Modeler )整合

    在IT领域,SpringBoot、Activiti和Oracle是三个非常重要的技术组件,它们分别代表了现代企业级应用开发的三大支柱:轻量级框架、工作流引擎和关系型数据库。本项目将这三者进行了深度整合,构建了一个高效、便捷的...

    COS——R.log

    org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only at org.springframework.transaction.support....

    Could not roll back Hibernate transaction.doc

    Could not roll back Hibernate transaction; nested exception is org.hibernate.TransactionException: JDBC rollback failed 这表明Hibernate事务回滚操作失败,导致事务不能正确回滚。 二、问题原因 该问题的...

    javax.transaction-api-1.2-API文档-中文版.zip

    赠送jar包:javax.transaction-api-1.2.jar; 赠送原API文档:javax.transaction-api-1.2-javadoc.jar; 赠送源代码:javax.transaction-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.transaction-api-1.2....

    「工控安全」asec-w04-derived-unique-token-per-transaction - APT.zip

    本文将围绕“asec-w04-derived-unique-token-per-transaction - APT”这一主题,深入探讨工控安全、数据泄露、勒索软件、大数据以及高级持续性威胁(APT)等关键知识点,同时也会提及安全集成、企业安全策略以及零...

    微软内部资料-SQL性能优化3

    Intent locks improve performance because SQL Server examines intent locks only at the table level to determine whether a transaction can safely acquire a lock on that table. This removes the ...

    javax.transaction-api-1.2-API文档-中英对照版.zip

    赠送jar包:javax.transaction-api-1.2.jar; 赠送原API文档:javax.transaction-api-1.2-javadoc.jar; 赠送源代码:javax.transaction-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.transaction-api-1.2....

    transaction-processing-concepts-and-techniques

    transaction-processing-concepts-and-techniques

    jboss-transaction-api

    jboss-transaction-api

    BURNINTEST--硬件检测工具

    - A hang on startup has been corrected. A 2 minute timeout has been added to the collection of system information. - Video playback, Hard disk and CD/DVD test 'no operations' error reporting ...

    Springboot 集成Tcc-transaction1

    在Spring Boot应用中集成TCC(Try-Confirm-Cancel)分布式事务管理,是为了解决在微服务架构中跨服务的复杂事务问题。TCC模式是一种补偿型事务处理方式,它将每个业务操作分为尝试(Try)、确认(Confirm)和取消...

    TCC-Transaction分布式事务DEMO

    TCC(Try-Confirm-Cancel)模式是一种解决分布式事务问题的有效方法。在这个名为"TCC-Transaction分布式事务DEMO"的项目中,我们将深入探讨TCC模式以及如何在基于Mysql数据库的环境中实现它。 **TCC模式详解** TCC...

    jboss-as-7.1.0.Final.zip

    《JBoss AS 7.1.0.Final:企业级应用服务器详解》 JBoss AS,全称为"Java EE Application Server",是Red Hat公司开发的一款开源、免费的应用服务器,它基于Java平台的企业级服务(Java Platform, Enterprise ...

    C#中调用Transaction

    本文将深入探讨“C#中调用Transaction”的相关知识点,包括事务的基本概念、事务的特性、如何在C#代码中创建和管理事务,以及与数据库交互时事务的应用。 ### 1. 事务基本概念 事务是数据库操作的一组逻辑单元,它...

    Java开发中常见问题解析

    &lt;tx:advice id="txAdvice" transaction-manager="transactionManager"&gt; &lt;!-- 示例 --&gt; *" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" no-rollback-for=...

    jboss-transaction-api_1.1_spec-1.0.1.Final.jar

    jboss-transaction-api_1.1_spec-1.0.1.Final.jar包 描述: There is a new version for this artifact

    tcc-transaction-master-1.2.x.zip

    本示例项目“tcc-transaction-master-1.2.x”提供了一种基于Dubbo的分布式事务解决方案,帮助开发者解决在分布式环境下执行事务时可能出现的问题。 1. **分布式事务** 分布式事务是指跨越多个数据库或者服务的事务...

    spring-transaction-demo.rar_DEMO_springboot_wash1vw

    《Spring Boot事务管理实战教程——基于spring-transaction-demo项目》 在软件开发中,事务管理是确保数据一致性、完整性和可靠性的关键环节。本教程将以`spring-transaction-demo`项目为示例,深入探讨如何在...

Global site tag (gtag.js) - Google Analytics