spring如何添加事务回滚

fiy 其他 22

回复

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

    在Spring中,可以通过配置或编程的方式来实现事务的回滚。下面分别介绍这两种方式。

    1. 通过配置实现事务回滚:
      a. 在Spring的配置文件中,配置数据源和事务管理器。
      b. 在需要启用事务的方法或类上添加@Transactional注解。
      c. 配置事务的属性,如传播行为、隔离级别、超时时间等。
      d. 设置rollbackFor属性来指定哪些异常发生时需要回滚。

    例如,下面是一个配置文件的示例:

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!-- 配置数据源属性 -->
    </bean>
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
    <tx:annotation-driven />
    
    <bean id="myService" class="com.example.MyService" />
    

    在需要启用事务的方法上添加@Transactional注解:

    @Service
    public class MyService {
    
        @Transactional(rollbackFor = Exception.class)
        public void doSomething() {
            // 业务逻辑
        }
    }
    
    1. 通过编程的方式实现事务回滚:
      a. 在方法内获取TransactionTemplate实例。
      b. 使用execute方法执行带有事务的代码块,在代码块中进行业务逻辑操作。
      c. 在需要回滚的情况下,调用setRollbackOnly方法将事务标记为回滚状态。

    例如,下面是代码的示例:

    @Service
    public class MyService {
    
        private TransactionTemplate transactionTemplate;
    
        @Autowired
        public MyService(PlatformTransactionManager transactionManager) {
            this.transactionTemplate = new TransactionTemplate(transactionManager);
        }
    
        public void doSomething() {
            transactionTemplate.execute(status -> {
                try {
                    // 业务逻辑
                    return null;
                } catch (Exception e) {
                    status.setRollbackOnly();
                    throw e;
                }
            });
        }
    }
    

    无论是通过配置还是编程的方式,当业务方法抛出指定的异常时,事务将会回滚。可以根据实际需求设置rollbackFor属性来指定需要回滚的异常类型。

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

    在Spring中,可以通过注解方式或者编程方式来添加事务回滚。

    1. 注解方式:

      • 在需要添加事务回滚的方法上添加@Transactional注解。
      • @Transactional注解可以配置rollbackFor属性,用于指定触发事务回滚的异常类型。例如:@Transactional(rollbackFor = Exception.class)表示任何异常都会触发事务回滚;@Transactional(rollbackFor = {CustomException1.class, CustomException2.class})表示只有CustomException1CustomException2类型的异常会触发事务回滚。
      • @Transactional注解还可以配置noRollbackFor属性,用于指定不触发事务回滚的异常类型。
    2. 编程方式:

      • 在代码中获取PlatformTransactionManager的实例,这可以通过Spring容器注入或者手动创建。
      • 使用获取到的PlatformTransactionManager实例,手动开始、提交或者回滚事务。
      • 例子代码如下:
    @Autowired
    private PlatformTransactionManager transactionManager;
    
    @Transactional
    public void foo() {
       // 会自动开启事务
       // 事务开始的代码
       
       try {
          // 业务逻辑处理
       } catch (Exception e) {
          // 发生异常,手动回滚事务
          TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
       }
       
       // 事务结束的代码
       // 事务提交或者回滚会自动完成
    }
    
    1. 配置事务管理器:
      • 在Spring配置文件中配置事务管理器,例如使用DataSourceTransactionManager或者JtaTransactionManager
      • 例子代码如下:
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource" />
       <!-- 可根据需要进行配置 -->
    </bean>
    
    1. 异常处理:

      • 如果业务处理出现异常,Spring会自动回滚事务。可以捕获异常并手动触发回滚,或者不捕获异常让其自动抛出。
      • 如果没有配置rollbackFor属性,Spring会默认在遇到RuntimeException及其子类的异常时回滚事务。
      • 如果需要在非运行时异常(checked exception)发生时触发事务回滚,可以通过配置rollbackFor属性指定相应的异常类型。
    2. 确认事务的传播行为:

      • 在使用事务时,还需要考虑事务的传播行为。
      • 事务的传播行为指的是在一个方法调用另一个方法时,如何处理事务。例如,如果方法A调用了方法B,两个方法都有事务注解,那么事务的传播行为决定了方法B是加入方法A的事务还是开启一个新的事务。
      • Spring提供了不同的事务传播行为,例如REQUIREDREQUIRES_NEWNESTED等。可以通过在@Transactional注解中配置propagation属性来指定事务的传播行为。

    总而言之,通过使用@Transactional注解或者编程方式,配置事务管理器,处理异常以及设置事务的传播行为,可以在Spring中添加事务回滚功能。

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

    Spring框架提供了一种简单的机制来实现事务回滚。在Spring中,可以使用注解方式或编程方式来添加事务回滚。

    1. 使用注解方式添加事务回滚:
      使用注解方式添加事务回滚可以简化代码,减少开发工作量。Spring框架提供了一系列的事务注解,包括@Transactional注解,可以使用该注解来标记需要进行事务管理的方法。

    (1) 配置事务管理器:
    首先需要配置事务管理器,Spring提供了多种事务管理器实现,如DataSourceTransactionManager用于JDBC事务管理、HibernateTransactionManager用于Hibernate事务管理等。可以根据具体的使用情况选择适合的事务管理器。

    (2) 标记需要进行事务管理的方法:
    在需要进行事务管理的方法上添加@Transactional注解,可以通过该注解的属性来配置事务的隔离级别、传播行为、事务超时等。

    (3) 添加事务回滚触发条件:
    可以通过@Transactional注解的rollbackFor属性来配置事务回滚的触发条件,当方法抛出指定的异常类型时,事务将回滚。

    示例代码如下:

    @Repository
    @Transactional(rollbackFor = Exception.class)
    public class ExampleDaoImpl implements ExampleDao {
        // 方法实现
    }
    
    1. 编程方式添加事务回滚:
      在一些特殊情况下,可能需要通过编程方式实现事务回滚。Spring提供了TransactionTemplate类来支持编程式事务管理。

    (1) 配置事务管理器:
    同样需要配置事务管理器,选择适合的事务管理器。

    (2) 使用TransactionTemplate进行编程式事务管理:
    通过TransactionTemplate类,可以在代码中手动开启、提交或回滚事务。

    示例代码如下:

    public class ExampleService {
        private TransactionTemplate transactionTemplate;
    
        public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
            this.transactionTemplate = transactionTemplate;
        }
    
        public void doSomething() {
            transactionTemplate.execute(new TransactionCallbackWithoutResult() {
                protected void doInTransactionWithoutResult(TransactionStatus status) {
                    // 事务内的代码
                }
            });
        }
    }
    

    需要注意的是,无论使用注解方式还是编程方式实现事务回滚,都需要配置事务管理器,并在Spring配置文件中进行相应的配置。

    综上所述,使用Spring框架可以很方便地实现事务回滚。无论是使用注解方式还是编程方式,都可以根据具体的业务需求选择合适的方式来实现事务回滚。

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

400-800-1024

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

分享本页
返回顶部