原来是这样设置的:
<tx:attributes>
<tx:method name="*" read-only="true"/>
</tx:attributes>
发现selectA调用selectB,如果selectB抛出Exception,selectA中捕获Exception但是并不继续向外抛出,最后会出现错误。
纠其原理其实很简单,在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>
这个状态用一句话概括就是“有则加入事物,无也不创建事物”。
分享到:
相关推荐
在IT领域,SpringBoot、Activiti和Oracle是三个非常重要的技术组件,它们分别代表了现代企业级应用开发的三大支柱:轻量级框架、工作流引擎和关系型数据库。本项目将这三者进行了深度整合,构建了一个高效、便捷的...
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; nested exception is org.hibernate.TransactionException: JDBC rollback failed 这表明Hibernate事务回滚操作失败,导致事务不能正确回滚。 二、问题原因 该问题的...
赠送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”这一主题,深入探讨工控安全、数据泄露、勒索软件、大数据以及高级持续性威胁(APT)等关键知识点,同时也会提及安全集成、企业安全策略以及零...
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 ...
赠送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
jboss-transaction-api
- 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 ...
在Spring Boot应用中集成TCC(Try-Confirm-Cancel)分布式事务管理,是为了解决在微服务架构中跨服务的复杂事务问题。TCC模式是一种补偿型事务处理方式,它将每个业务操作分为尝试(Try)、确认(Confirm)和取消...
TCC(Try-Confirm-Cancel)模式是一种解决分布式事务问题的有效方法。在这个名为"TCC-Transaction分布式事务DEMO"的项目中,我们将深入探讨TCC模式以及如何在基于Mysql数据库的环境中实现它。 **TCC模式详解** TCC...
《JBoss AS 7.1.0.Final:企业级应用服务器详解》 JBoss AS,全称为"Java EE Application Server",是Red Hat公司开发的一款开源、免费的应用服务器,它基于Java平台的企业级服务(Java Platform, Enterprise ...
本文将深入探讨“C#中调用Transaction”的相关知识点,包括事务的基本概念、事务的特性、如何在C#代码中创建和管理事务,以及与数据库交互时事务的应用。 ### 1. 事务基本概念 事务是数据库操作的一组逻辑单元,它...
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 示例 --> *" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" no-rollback-for=...
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”提供了一种基于Dubbo的分布式事务解决方案,帮助开发者解决在分布式环境下执行事务时可能出现的问题。 1. **分布式事务** 分布式事务是指跨越多个数据库或者服务的事务...
《Spring Boot事务管理实战教程——基于spring-transaction-demo项目》 在软件开发中,事务管理是确保数据一致性、完整性和可靠性的关键环节。本教程将以`spring-transaction-demo`项目为示例,深入探讨如何在...