SpringBoot声明式事务和手动事务

本文探讨了SpringBoot中的声明式事务管理,强调了启用@EnableTransactionManagement注解和@Transactional注解在方法上的使用。同时,指出了声明式事务在类内部调用和抛出checked异常时不生效的问题,并提供了相应的解决方案。此外,还简要提到了手动提交事务的相关内容。

声明式事务(注解)

  1. 在启动类中加上@EnableTransactionManagement注解,开启注解事务

    spring boot应该会自动开启注解事务配置,这里没有试验过,加上注解准没错

    @SpringBootApplication
    @EnableTransactionManagement
    public class AppStarter{
        public static void main(String[] args) {
            System.setProperty("spring.devtools.restart.enabled", "false");
            SpringApplication.run(AppStarter.class, args);
        }
    }
    
  2. 在需要使用事务管理的方法上加上@Transactional注解即可实现事务管理

  3. 事务失效的情况
    (1)类内部方法调用
    AService中有一个方法 A,调用了AService的方法 B, 方法 A 没有事务管理,方法 B 采用了声明式事 务,在方法 A 中调用方法 B,实际上是通过“this”的引用,也就是直接调用了目标类的方法,而非通过 Spring 上下文获得的代理类,所以事务不会开启。

    Spring的声明式事务是通过AOP实现的,会产生一个代理类来做事务管理,因此必须使用注入的对象(代理对象)调用才会生效。采用声明式事务的方法执行前,会先通过拦截器TransactionInterceptor开启事务,然后才被调用执行,执行结束后,TransactionInterceptor 会提交或回滚事务

    (2)抛出了checked异常
    在默认配置的情况下,所有的 checked 异常都不会引起事务回滚。

    注:Unchecked Exception包括Error与RuntimeException. RuntimeException的所有子类也都属于此类。另一类就是checked Exception。

    可以通过指定回滚异常来解决:

    @Transactional(rollbackForClassName={"Exception"})
    或者
    @Transactional(rollbackFor={Exception.class})
    

    也可以指定不回滚的异常:

    @Transactional(noRollbackForClassName={"InstrumentNotFoundException"})
    或者
    @Transactional(noRollbackFor={InstrumentNotFoundException.class})
    

手动提交事务

  1. 注入两个对象

    @Autowired
    DataSourceTransactionManager dataSourceTransactionManager;
    @Autowired
    TransactionDefinition transactionDefinition;
    
  2. 事务使用方法

    //手动开启事务
    TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
    //手动提交事务
    dataSourceTransactionManager.commit(transactionStatus);//提交
    //手动回滚事务
    dataSourceTransactionManager.rollback(transactionStatus);//最好是放在catch 里面,防止程序异常而事务一直卡在哪里未提交
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值