`
javaPrimary
  • 浏览: 60860 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring事务的[Transaction rolled back because it has been marked as rollback-only]浅析

阅读更多

有时候在使用事务的时,做了事务嵌套,结果其中有一个抛出异常时,异常会一直连续跑出到最外层。

问题:明明捕获了异常为什么还会抛出。

	@Transactional //第一层 会在方法执行完成后,在进行提交。此时代码已经失去了try-catch保护
	public UserReply queryUser(UserQuery query)
	{
		BaseAccountExt user = null;
		try
		{
                        // 第二层。在此方法中也配置有事务,且抛出异常。它的异常会传递给当前方法
			user = accountService.query(query.getAppCode());
		}
		catch(Exception ex)  // 捕获异常
		{
			ex.printStackTrace();
		}
	
		System.out.println("-----------------------分割线-------------------------------");
		return new UserReply(user);
	}

   

    @Transactional
    public BaseAccountExt query(String name){

        // 先更新数据
    	BaseAccount baseAccountExt = new BaseAccount();
    	baseAccountExt.setFullName("abcd");
    	baseAccountExt.setName(baseAccountExt.getName());
    	baseAccountService.update(baseAccountExt);
    	
        throw new RuntimeException("当前对象不为空!");
    }

 

解决办法:网上可能有很多种说法,但是所有的方法都是一种规避.

  •  或者去掉第一层Transactional,在该方法中,只有向下调用和DB交互,则此一层建议不要在追加事务。
  • 让第二层嵌套事务,不要传递异常到外面,改变事务类型,(其实和第一种相似,但是可能会有业务限制)添加方法:propagation=Propagation.REQUIRES_NEW
  • 在第一层外面,在做一层异常捕获,完整的保证事务异常绝对可以被拦截到。
@ExceptionHandler(value = { ApiException.class, BindException.class,
			Exception.class })
	protected ApiReply checkedException(Exception ex) {
		ApiReply reply = new ApiReply(ApiReplyCode.FAILED);
		
		if (ex instanceof TransactionException) {
			reply = new ApiReply(ApiReplyCode.TRANSACTIONEXCEPTION);
		}
		logError(request, reply, ex);
		return reply;
	}
 

 

0
3
分享到:
评论

相关推荐

    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....

    spring-transaction.jar.zip

    "spring-transaction.jar"正是提供了Spring事务管理的类库,它包含了一系列用于处理事务的接口、类和配置元素,使得开发者能够方便地实现事务控制。 一、Spring 事务管理概述 Spring事务管理分为编程式事务管理和...

    Spring在Transaction事务传播行为种类

    ### Spring中的Transaction事务传播行为种类详解 #### 一、引言 在开发基于Spring框架的应用程序时,事务管理是确保数据一致性的重要手段之一。Spring框架提供了丰富的事务管理功能,其中包括了事务传播行为...

    spring事务与数据库操作

    ### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...

    Spring 常用 Transaction Annotation

    最后,结合`Book1.xlsx`这个文件名,虽然它看起来像一个Excel文件,但在这里没有提供具体的文件内容,所以无法直接关联到Spring事务注解的知识点。通常,这样的文件可能包含有关Spring事务管理的示例数据、测试用例...

    spring-transaction-demo.rar_DEMO_springboot_wash1vw

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

    Spring事务管理的jar包

    本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...

    Spring事务原理、Spring事务配置的五种方式

    Spring事务原理和配置 Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两...

    Spring2.0 事务处理

    在IT行业中,Spring框架是Java企业级应用开发的首选框架之一,尤其是在事务管理方面,它提供了强大而灵活的解决方案。Spring 2.0版本在事务处理方面做了许多改进,使得开发者能够更有效地管理应用程序的事务边界。这...

    springtransaction 事务管理

    Spring事务管理主要包括编程式事务管理和声明式事务管理两种方式,使得开发者能够在不深入理解底层事务实现的情况下,轻松地在应用程序中管理事务。 1. **编程式事务管理**: 编程式事务管理是通过调用`...

    Spring事务流程图

    Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在Spring中,事务管理分为编程式和声明式两种方式。本篇文章将详细解释Spring事务管理的流程,以及如何通过时序图来理解这一...

    springTransaction.rar

    这个名为"springTransaction.rar"的压缩包文件包含了一个关于Spring事务管理的小型示例,旨在演示如何使用Spring的事务传播机制来处理数据库操作,特别是转账功能的实现。 首先,让我们了解一下什么是事务。在...

    spring-transaction-demo:spring-transaction-demo

    综上所述,"spring-transaction-demo"项目是一个极好的学习资源,帮助开发者理解和掌握Spring事务管理的精髓,特别是其事务传播机制。通过实践这些示例,可以提升开发者在实际项目中的事务处理能力。

    spring事务配置详解

    Spring 事务配置是Spring 框架中的重要组成部分,它提供了对数据库操作事务性的管理,确保数据的一致性和完整性。Spring 提供了多种方式来配置事务管理,主要分为编程式事务管理和声明式事务管理。下面将详细介绍这...

    实验 spring 声明事务

    声明式事务管理的原理在于,当满足特定条件(如上述配置中的方法匹配)时,Spring 会自动开始、提交或回滚事务,无需在业务逻辑代码中显式调用`beginTransaction()`、`commit()`或`rollback()`等事务管理API。...

    org.springframework.transaction-3.2.2.RELEASE

    org.springframework.transaction-3.2.2.RELEASE最新版本

    spring-tx事务管理实例

    Spring事务管理是企业级Java应用中不可或缺的一部分,它确保了数据的一致性和完整性,尤其是在多线程和分布式环境中。本实例将深入探讨Spring事务管理的实现与应用。 首先,Spring事务管理分为编程式事务管理和声明...

    Spring使用XML配置声明式事务

    在Spring框架中,声明式事务管理是实现事务处理的一种高效且灵活的方式,它允许开发者通过XML配置或注解来定义事务边界,而无需在业务逻辑代码中显式地调用开始、提交或回滚事务的方法。这篇博文"Spring使用XML配置...

    spring事务,xml方式和注解方式

    Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在多线程、分布式系统中,事务管理显得尤为重要。本节将详细介绍Spring如何通过XML配置和注解方式来实现事务管理。 首先,...

Global site tag (gtag.js) - Google Analytics