You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中嵌套调用TransactionSynchronizationManager.registerSynchronization()不生效问题求助

Spring中嵌套调用TransactionSynchronizationManager.registerSynchronization()不生效问题求助

我最近碰到了一个Spring事务同步的问题,试了好几种方法都没解决,来求助各位大佬!

我写了三个关联的服务类,代码分别如下:

Service One

@Service
@RequiredArgsConstructor
public class TransactionAService {

    private final TransactionBService transactionBService;

    private final UserMapper userMapper;

    @Transactional(rollbackFor = Exception.class)
    public void transactionA() {
        User user = new User();
        user.setUsername("apple-" + UUID.randomUUID().toString().replace("-", "").substring(0, 4));
        user.setPassword("abc123");
        userMapper.insert(user);
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCommit() {
                transactionBService.transactionB();
            }
        });
    }
}

Service Two

@Service
@RequiredArgsConstructor
public class TransactionBService {

    private final TransactionCService transactionCService;

    private final UserMapper userMapper;

    @Transactional(rollbackFor = Exception.class)
    public void transactionB() {
        User user = new User();
        user.setUsername("banana-" + UUID.randomUUID().toString().replace("-", "").substring(0, 4));
        user.setPassword("abc123");
        userMapper.insert(user);
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCommit() {
                transactionCService.transactionC();
            }
        });
    }
}

Service Three

@Slf4j
@Service
@RequiredArgsConstructor
public class TransactionCService {

    private final UserMapper userMapper;

    @Transactional(rollbackFor = Exception.class)
    public void transactionC() {
        log.info("hello cat");
        User user = new User();
        user.setUsername("cat-" + UUID.randomUUID().toString().replace("-", "").substring(0, 4));
        user.setPassword("abc123");
        userMapper.insert(user);
    }
}

现在的问题是:当我调用transactionAService.transactionA()方法后,发现transactionCService.transactionC()完全没被执行!最后数据库的user表里只有两条数据——apple开头和banana开头的,cat开头的那条根本没插进去。

我用的Spring Boot版本是2.7.18,有没有大佬能帮忙分析下原因呀?万分感谢!


备注:内容来源于stack exchange,提问作者Garmin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:09:33