Spring事务与多线程的先后结束问题
更新: 7/11/2025 字数: 0 字 时长: 0 分钟
情景
在Spring中,如果你的一个方法被@Transactional标注,则认为这个方法内的操作是一个事务操作,这会导致如果方法中有代码报错,那么会回滚之前的所有数据库操作。
但是这里有一个注意事项——如果方法return了,那么也会执行提交/回滚
在同步代码中这自然没有问题,因为一旦方法return了,也就说明这个方法之前的内容全部执行完毕,也就可以提交了。
但是在异步操作中,return就不一定能代表之前的操作全部完成了,因为异步操作和其他的操作是在不同的线程执行的。
然而之前的Spring事务管理仍然会对这个异步方法生效。
这也就导致了如果外界return早于异步操作结束,就会导致异步操作的sql很有可能不会执行。
解决方法
我们可以直接将异步方法中的操作提取到一个新的类中,然后对这个操作加上@Transactional标注,这就代表着我们告诉Spring这个方法有着自己单独的事务管理,这也就不会被异步线程外的@Transactional标注影响,进而导致上面的问题