事务上下文按线程存放,子线程里查不到,注解自然不会生效。
结果是子线程里的写操作各自自动提交,主事务回滚也带不动它们。
正确做法:在子线程内用 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






暂无评论内容