spring 事物注解 如何回滚

fiy 其他 30

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring事务注解提供了很方便的事务管理方式,其中包括了事务的提交和回滚操作。在Spring中,事务的回滚可以通过以下几种方式实现:

    1. @Transactional注解中的rollbackFor属性:可以通过该属性来指定哪些异常发生时,事务应该回滚。如果在方法中抛出了rollbackFor属性指定的异常或其子类异常,事务将会回滚。
      例如:
    @Transactional(rollbackFor = {SQLException.class})
    public void foo() {
        // 抛出SQLException异常时,事务回滚
    }
    
    1. @Transactional注解中的noRollbackFor属性:可以通过该属性来指定哪些异常发生时,事务不应该回滚。即使在方法中抛出了noRollbackFor属性指定的异常或其子类异常,事务也不会回滚。
      例如:
    @Transactional(noRollbackFor = {NullPointerException.class})
    public void bar() {
        // 抛出NullPointerException异常时,事务不回滚
    }
    
    1. @Transactional注解中的rollbackForClassName属性和noRollbackForClassName属性:这两个属性与前面两个属性的作用类似,可以通过指定异常类名称的方式来进行配置。
      例如:
    @Transactional(rollbackForClassName = "java.sql.SQLException")
    public void baz() {
        // 抛出SQLException异常时,事务回滚
    }
    
    @Transactional(noRollbackForClassName = "java.lang.NullPointerException")
    public void qux() {
        // 抛出NullPointerException异常时,事务不回滚
    }
    

    以上是使用Spring事务注解实现事务回滚的几种方式,根据具体需求来选择适合的方式来配置事务的回滚。如果没有显式配置回滚方式,默认情况下,Spring事务会在发生运行时异常时进行回滚。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    回滚是指在事务处理过程中发生错误或异常时取消已经执行的操作并返回到事务开始之前的状态。Spring框架提供了多种方式来实现事务的回滚,其中包括使用事务注解的方式。

    下面是使用Spring事务注解进行回滚的步骤:

    1. 配置数据源和事务管理器:在applicationContext.xml文件中配置数据源和事务管理器,例如:
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
       <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
       <property name="username" value="root"/>
       <property name="password" value="password"/>
    </bean>
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource"/>
    </bean>
    
    1. 启用注解驱动的事务管理:在applicationContext.xml文件中添加以下代码启用注解驱动的事务管理支持:
    <tx:annotation-driven/>
    
    1. 声明需要进行事务管理的方法:在需要进行事务管理的方法上添加@Transactional注解,例如:
    @Transactional
    public void updateAccount(int accountId, double amount) {
       // 更新账户余额
       // ...
    }
    
    1. 设置事务回滚条件:可以使用@Transactional注解的rollbackFor属性来指定发生哪些异常时需要回滚事务,例如:
    @Transactional(rollbackFor = {SQLException.class, InsufficientFundsException.class})
    public void transferMoney(int fromAccountId, int toAccountId, double amount) throws InsufficientFundsException {
       // 转账操作
       // ...
    }
    
    1. 触发事务回滚:当在被@Transactional注解修饰的方法中抛出满足回滚条件的异常时,事务管理器会自动回滚事务,并将数据库状态恢复到事务开始之前的状态。

    使用Spring事务注解进行回滚可以方便地管理事务,并且可以提高代码的简洁性和可读性。但需要注意的是,使用事务注解时需要注意事务的边界和回滚条件的设置,以确保事务能够正确地回滚。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring 提供了多种方式来实现事务回滚,其中包括编程式事务管理和声明式事务管理。声明式事务管理是通过事务注解来实现的,本文将围绕 Spring 事务注解的使用和事务回滚的实现进行详细介绍。

    首先,我们需要在 Spring 配置文件中启用注解驱动事务管理:

    <tx:annotation-driven transaction-manager="transactionManager" />
    

    其中,transactionManager 是一个支持事务管理的数据源。在配置文件中配置了该元素之后,Spring 将会自动为带有事务注解的方法开启事务。

    接下来,我们将介绍常用的 Spring 事务注解和事务回滚的实现方式。

    1. @Transactional
      @Transactional 注解用于标记一个方法需要被事务管理,它可以放置在方法级别或类级别上。

    示例:

    @Transactional
    public void transactionalMethod() {
        // 事务处理逻辑
    }
    

    如果希望配置更多的事务属性,可以在 @Transactional 注解中添加其他属性,例如事务传播行为、事务超时、只读等。

    1. 事务传播行为
      事务的传播行为定义了在多个事务方法相互调用的情况下,事务是如何传播的。Spring 提供了多种事务传播行为选项,例如 REQUIRED(默认值)、REQUIRES_NEW、NESTED、SUPPORTS、NOT_SUPPORTED 和 NEVER。

    示例:

    @Transactional(propagation = Propagation.REQUIRED)
    public void methodA() {
        // 调用方法B
        methodB();
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodB() {
        // 事务逻辑
    }
    

    在以上示例中,方法 methodA() 有一个 REQUIRED 传播行为的事务,并调用了方法 methodB(),后者有一个 REQUIRES_NEW 传播行为的事务。当 methodA() 被调用时,会创建一个新的事务,并在执行完 methodB() 后,提交事务。

    1. 事务回滚
      事务回滚可以在方法中通过抛出异常来触发,被注解的方法将会回滚之前的操作。

    示例:

    @Transactional
    public void rollbackMethod() {
        // 事务处理逻辑
        throw new Exception("出现异常,回滚事务");
    }
    

    在以上示例中,当 rollbackMethod() 方法抛出异常时,事务将会回滚。

    另外,如果希望根据抛出的异常类型来决定是否回滚事务,可以使用 @Transactional 注解的 rollbackFor 属性来指定需要回滚的异常类型。

    示例:

    @Transactional(rollbackFor = Exception.class)
    public void rollbackMethod() {
        // 事务处理逻辑
        throw new Exception("出现异常,回滚事务");
    }
    

    在以上示例中,无论抛出的异常类型是什么,事务都会回滚。

    总结:
    通过 @Transactional 注解可以实现声明式事务管理,在需要管理事务的方法上标注该注解即可。事务回滚可以通过抛出异常来触发,也可以通过配置 rollbackFor 属性来指定需要回滚的异常类型。同时,事务的传播行为可以灵活地设置,以满足不同的业务需求。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部