Spring里面怎么回滚事务

fiy 其他 62

回复

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

    在Spring框架中,可以通过使用@Transactional注解来管理事务。当一个方法被@Transactional注解修饰时,该方法会在执行过程中开启一个事务,并在方法执行结束时自动提交或回滚事务。

    在使用@Transactional注解时,可以通过设置rollbackFor属性来指定事务应该回滚的异常类型。当方法中抛出rollbackFor属性所指定的异常类型时,事务会被回滚。

    另外,还可以使用@Transactional注解的noRollbackFor属性来指定事务不应该回滚的异常类型。当方法中抛出noRollbackFor属性所指定的异常类型时,事务不会被回滚。

    在基于XML配置的方式中,可以在配置文件中使用tx:advicetx:attributes来配置事务的回滚策略。在tx:advice中可以设置异常的类型,以及是否回滚事务。在tx:attributes中可以定义哪些方法需要开启事务,并设置事务的回滚策略。

    在Spring的事务管理中,默认情况下,当方法抛出RuntimeException及其子类异常时,事务会回滚。当方法抛出Checked Exception类型的异常时,事务不会回滚。

    总结起来,Spring中回滚事务的方式有以下几种:

    1. 使用@Transactional注解,在方法上添加@Transactional注解,并通过设置rollbackFor属性来指定事务回滚的异常类型。
    2. 通过设置noRollbackFor属性来排除某些异常不回滚事务。
    3. 在基于XML配置的方式中,可以使用tx:advicetx:attributes来配置事务的回滚策略。

    以上是Spring中回滚事务的几种方式,根据具体的需求选择合适的方式来管理事务的回滚。

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

    在Spring中实现事务回滚有多种方式。下面是一些常用的方法:

    1. 声明式事务回滚:使用@Transactional注解在方法或类级别上进行声明,并通过设置rollbackFor属性指定需要回滚的异常类型。当方法抛出指定异常时,事务将会回滚。
    @Transactional(rollbackFor = Exception.class)
    public void methodWithTransactional() {
        // 事务操作
        // 抛出异常,触发事务回滚
    }
    
    1. 编程式事务回滚:在需要回滚事务的地方,通过调用TransactionAspectSupport类的静态方法进行手动回滚。
    public void methodWithProgrammaticRollback() {
        // 事务操作
        try {
            // 抛出异常,触发事务回滚
        } catch (Exception e) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    
    1. 异常处理器事务回滚:在Spring中,可以通过配置一个ExceptionHandler来处理异常,并在ExceptionHandler中触发事务回滚。
    public void methodWithExceptionHandler() {
        try {
            // 事务操作
        } catch (Exception e) {
            // 异常处理
            throw new Exception("Exception occurred");
        }
    }
    
    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        // 触发事务回滚
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        return "error";
    }
    
    1. 在XML配置中进行事务回滚设置:可以通过在Spring的配置文件中进行事务管理的配置,包括指定回滚事务的异常类型。
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
           <tx:method name="*" rollback-for="Exception" />
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:pointcut id="serviceMethods" expression="execution(* com.example.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
    </aop:config>
    
    1. 异常回滚规则:在Spring中,可以通过使用RollbackRuleAttribute和NoRollbackRuleAttribute类来指定事务回滚的规则,以决定事务在遇到不同类型的异常时是否回滚。
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
    <bean id="rollbackRule" class="org.springframework.transaction.interceptor.RollbackRuleAttribute">
        <constructor-arg value="com.example.CustomException" />
    </bean>
    
    <bean id="noRollbackRule" class="org.springframework.transaction.interceptor.NoRollbackRuleAttribute">
        <constructor-arg value="java.lang.NullPointerException" />
    </bean>
    
    <tx:advice id="txAdvice">
        <tx:attributes>
            <tx:method name="*" rollback-for="Throwable" no-rollback-for="java.lang.NullPointerException" />
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:pointcut id="serviceMethods" expression="execution(* com.example.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
    </aop:config>
    

    以上是Spring中回滚事务的一些常用方式,可以根据具体的需求选择合适的方法。

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

    在Spring框架中,可以使用编程式或声明式的方式来实现事务的回滚。下面将分别介绍这两种方式的操作流程。

    一、编程式事务回滚
    编程式事务回滚是通过编写代码来控制事务的提交和回滚。事务的控制流程如下:

    1. 开启事务:在方法开始前,使用TransactionTemplatePlatformTransactionManager开启事务。
    2. 执行业务逻辑:进行数据库操作或其他业务逻辑处理。
    3. 判断事务成功或失败:根据业务逻辑的返回结果或异常判断事务的执行成功与失败。
    4. 回滚事务:如果事务失败,调用TransactionTemplatePlatformTransactionManagerrollback方法进行事务的回滚操作。
    5. 提交事务:如果事务成功,调用TransactionTemplatePlatformTransactionManagercommit方法进行事务的提交。

    具体代码如下:

    @Autowired
    private PlatformTransactionManager transactionManager;
    
    ...
    
    @Transactional
    public void businessLogic() {
        try {
            // 执行业务逻辑
            // 判断业务逻辑是否成功
            // 失败时抛出异常
        } catch (Exception e) {
            // 回滚事务
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            throw e;
        }
    }
    

    二、声明式事务回滚
    声明式事务回滚是通过在Spring配置文件中对事务进行配置,使用AOP技术自动实现事务的控制。事务的控制流程如下:

    1. 配置事务管理器:在Spring配置文件中配置事务管理器,例如使用DataSourceTransactionManager
    2. 配置事务属性:在Spring配置文件中配置事务的传播行为、隔离级别、超时时间等属性。
    3. 在需要事务控制的方法上添加注解:在目标方法上使用@Transactional注解,Spring将根据注解的配置来启用事务控制。
    4. 执行业务逻辑:进行数据库操作或其他业务逻辑处理。
    5. 判断事务成功或失败:根据业务逻辑的返回结果或异常判断事务的执行成功与失败。
    6. 回滚事务:如果事务失败,Spring框架将自动回滚当前事务。
    7. 提交事务:如果事务成功,Spring框架将自动提交当前事务。

    具体配置如下所示:

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
    ...
    
    @Service
    public class MyService {
    
        @Autowired
        private MyDAO myDao;
        
        @Transactional
        public void businessLogic() {
            try {
                // 执行业务逻辑
                // 判断业务逻辑是否成功
                // 失败时抛出异常
            } catch (Exception e) {
                throw e;
            }
        }
    }
    

    以上就是在Spring框架中实现事务回滚的方法和操作流程。需要注意的是,使用声明式事务回滚时,Spring默认只对Unchecked Exception(RuntimeException)进行回滚操作,对Checked Exception需要通过配置rollbackFornoRollbackFor属性来指定哪些异常需要回滚或不回滚。

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

400-800-1024

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

分享本页
返回顶部