`

Spring中抛出异常时,既要要返回错误信息,还要做事务回滚

阅读更多

情况一:如果没有在程序中手动捕获异常,如下代码事务会回滚

@Transactional(rollbackFor = { Exception.class })  
public void test() throws Exception {  
     doDbStuff1();  
     doDbStuff2();//假如这个操作数据库的方法会抛出异常,方法doDbStuff1()对数据库的操作会回滚。  
}

        如果doDbStuff2()方法抛出异常,方法doDbStuff1()对数据库的操作会回滚。  

 

情况二:如果在程序中自已捕获异常未往外抛,如下代码事务不会回滚

@Transactional(rollbackFor = { Exception.class })  
public void test() {  
     try {  
        doDbStuff1();  
        doDbStuff2();//假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作  不会回滚。  
     } catch (Exception e) {  
           e.printStackTrace();     
     }  
}

        如果doDbStuff2()这个操作数据库的方法抛出异常,因为将异常捕获未往外抛,方法doDbStuff1()对数据库的操作不会回滚。

 

情况三:如果自己需要捕获异常又要返回错误时,可以参考以下做法

@Transactional(rollbackFor = { Exception.class })  
public void test() {  
     try {  
        doDbStuff1();  
        doDbStuff2();  
     } catch (Exception e) {  
          e.printStackTrace();     
          TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//就是这一句了,加上之后,如果doDbStuff2()抛了异常,                                                                                     //doDbStuff1()是会回滚的  
            return “xxx错误信息”;
     }  
}

 

分享到:
评论

相关推荐

    浅谈Spring中@Transactional事务回滚及示例(附源码)

    浅谈Spring中@Transactional事务回滚及示例 @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked...

    SpringBoot的事务使用和回滚功能讲解.docx

    因此,为了确保事务回滚,你需要在`catch`块中重新抛出异常,或者在`finally`块中显式调用手动回滚的方法。特别要注意,如果`try-catch`块包含在`finally`中且在`finally`中有返回操作,那么catch中的异常会被返回...

    使用SpringBoot注解方式处理事务回滚实现

    例如,在一个银行系统中,如果用户想要转账,但是在转账过程中出现错误,事务回滚机制可以将数据库回滚到转账前的状态,以避免数据的不一致。 在 SpringBoot 中,我们可以使用注解方式来处理事务回滚。我们可以在...

    spring声明式事务处理demo

    默认情况下,如果方法抛出未检查异常(继承自RuntimeException的异常)或者TransactionException,Spring会回滚事务;否则,事务会在方法结束时提交。 ```java @Service public class UserService { @...

    Spring事务详解

    当@Transactional注解的方法中抛出未检查异常(继承自RuntimeException的异常)时,Spring会自动回滚事务;而对于受检异常(非RuntimeException),除非显式声明,否则事务不会回滚。这种默认行为可以帮助我们更好地...

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

    PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前...

    Spring Boot数据库事务控制.zip

    3. **事务回滚规则**:默认情况下,如果在@Transactional注解的方法中抛出未检查异常(继承自RuntimeException的异常)或者Error,Spring会自动回滚事务。对于受检查异常(非RuntimeException),需要显式地声明需要...

    Spring声明式事务处理

    - `NEVER`:始终在非事务上下文中运行,如果当前存在事务,则抛出异常。 - `NESTED`:如果当前存在事务,则创建一个嵌套事务。如果当前没有事务,则行为同`REQUIRED`。 隔离级别主要有五种,它们决定了事务之间如何...

    spring基于AspectJ实现事务控制

    默认情况下,如果方法抛出未检查异常(继承自`RuntimeException`的异常)或`Error`,事务将被回滚;否则,事务将在方法正常结束时提交。 3. **事务属性**:`@Transactional`注解还支持一些可选属性,如`propagation...

    深入理解spring的事务管理机制

    在传统的JDBC操作中,如果想要利用事务,通常需要手动控制事务的开启、提交或回滚等过程。例如: 1. **获取连接**:`Connection con = DriverManager.getConnection();` 2. **开启事务**:`con.setAutoCommit(false...

    spring.net oracle 事务控制

    在Spring.NET中,我们可以利用AOP来实现这个功能,创建一个切面,该切面会在方法执行前后进行拦截,如果方法抛出异常,就调用TransactionManager的Rollback方法。 在实际应用中,我们还需要注意以下几点: 1. **...

    Spring 事务 (二) Spring 声明式事务 配置

    4. **事务回滚规则**:默认情况下,如果在@Transactional注解的方法中发生未捕获的运行时异常,Spring会自动回滚事务。可以通过`rollbackFor`属性指定需要回滚的异常类型。 5. **事务配置**:在Spring XML配置文件...

    spring事务的传播特性和事务隔离级别

    - 以非事务方式执行,如果当前存在事务,则抛出异常。这用于完全避免在事务上下文中执行的操作。 7. **PROPAGATION_NESTED** - 如果当前存在事务,则创建一个嵌套事务。如果当前不存在事务,则行为类似于`...

    Spring 事务授课代码

    - `NEVER`: 禁止在事务中运行,如果当前存在事务,抛出异常。 - `NESTED`: 如果当前存在事务,那么嵌套事务将在当前事务内运行;如果没有,则按REQUIRED行为进行。 3. **事务隔离机制**:事务的隔离级别定义了...

    spring事务全解释

    5. **事务回滚规则**:在默认情况下,如果在事务中抛出未检查异常(继承自RuntimeException的异常)或者Error,Spring会自动回滚事务。对于检查异常(非 RuntimeException 的异常),如果不显式声明,Spring不会自动...

    spring05-6

    如果抛出未检查异常(继承自`RuntimeException`的异常)或在事务配置中指定的检查异常,Spring会自动回滚事务。 在描述中的问题中,开发者可能没有在服务层的方法上正确地使用`@Transactional`注解,或者事务配置...

    Spring事务简介.docx

    - **PROPAGATION_NEVER**:不允许在事务中运行,如果在事务中则抛出异常。 - **PROPAGATION_MANDATORY**:如果调用者在一个事务中,则被调用的方法也必须在事务中,否则抛出异常。 - **PROPAGATION_NESTED**:如果...

    spring事务

    如果当前存在事务则加入,否则新建)、`SUPPORTS`(如果存在事务则加入,否则不开启新的事务)、`MANDATORY`(如果存在事务则加入,否则抛出异常)、`REQUIRES_NEW`(总是新建事务,即使外部已有事务也要挂起)、`...

    Spring2.5和Hibernate3集成--学习spring aop ioc

    * 在编写业务逻辑方法时,最好将异常一直往上抛出,由表示层处理(Struts) * spring的事务管理需要添加到业务逻辑上(事务边界的定义),不要回到Dao上 技术提示: 在编写经下代码时: *" propagation=...

Global site tag (gtag.js) - Google Analytics