丢到子线程里执行数据库操作,事务注解不生效

事务上下文按线程存放,子线程里查不到,注解自然不会生效。

结果是子线程里的写操作各自自动提交,主事务回滚也带不动它们。

正确做法:在子线程内用 TransactionTemplate 显式开一段独立事务。

异步方法还要放到另一个 bean 上,同类里 this 调用不走代理,注解同样失效。

// 子线程内显式事务
@Autowired private TransactionTemplate txTemplate;

CompletableFuture.runAsync(() ->
    txTemplate.execute(status -> {
        orderMapper.updateStatus(orderId, 2);
        return null;                     // 独立事务,自己提交或回滚
    })
);

// 异步 + 事务:写到另一个 bean,由外部调用(不能 this 自调用)
@Service
public class OrderAsyncService {
    @Async
    @Transactional
    public void handle(Long id) { ... }
}
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容