浅谈spring的嵌套事务

本文深入探讨了Spring框架中的嵌套事务,解释了嵌套事务的实质是通过savepoint实现的单个物理事务,并通过实例展示了嵌套事务如何处理异常,强调了在使用事务同步器时的注意事项。文章最后总结了REQUIRED和NESTED在不同场景下的应用差异。
摘要由CSDN通过智能技术生成

1.当我们在谈论嵌套事务的时候,嵌套的是什么?


当看到`嵌套事务`第一反应想到是这样式的:

但这更像PROPAGATION_REQUIRES_NEW啊,感兴趣可以去打断点执行一下。PROPAGATION_REQUIRES_NEW事务传播下,方法A调用方法B就是这样,

//        事务A doBegin()
//            事务B doBegin()
//            事务B doCommit()
//        事务A doCommit()
 
复制代码

而在PROPAGATION_NESTED事务传播下,打了个断点,会发现只会执行一次doBegin和doCommit:

事务A doBegin()
事务A doCommit()
复制代码

我们用代码输出更加直观。
定义两个方法serviceA和serviceB,使用前者调用后者。前者事务传播使用REQUIRED,后者使用PROPAGATION_NESTED

@Transactional(propagation = Propagation.REQUIRED)
    public void serviceA(){
            Tcity tcity2 = new Tcity();
            tcity2.setId(0);
            tcity2.setStateCode("5");
            tcity2.setCnCity("测试城市2");
            tcity2.setCountryCode("ALB");
            tcityMapper.insertSelective(tcity2);
            transactionInfo();
            test2.serviceB();
    }
复制代码
 @Transactional(rollbackFor = Exception.class, propagation = Propagation.NESTED)
    public void serviceB() {
        Tcity tcity = new Tcity();
        tcity.setId(0);
        tcity.setStateCode("5");
        tcity.setCnCity("测试城市");
        tcity.setCountryCode("ALB");
        tcityMapper.insertSelective(tcity);
        tcityMapper.selectAll2();
        transactionInfo();
复制代码

这里的transactionInfo()使用事务同步器管理器TransactionSynchronizationManager注册一个事务同步器TransactionSynchronization
这样在事务完成之后afterCompletion会输出当前事务是commit还是rollback,这样也便于测试,比起去刷新数据库看有没有写入,更加方便快捷直观。

同时使用TransactionSynchronizationManager.getCurrentTransactionName()可以得到当前事务的名称,这样可以直观的看到当前方法使用的是同一个事务还是不同的事务。

protected void transactionInfo() {

        String transactionName = TransactionSynchronizationManager.getCurrentTransactionName();
        boolean active = TransactionSynchronizationManager.isActualTransactionActive();
        log.info("transactionName:{}, active:{}", transactionName, active);

        if (!active) {
            log.info("transaction :{} not active", transactionName);
            return;
        }
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCompletion(int status) {
                if (status == STATUS_COMMITTED) {
                    log.info("transaction :{} co
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值