@Transactional(propagation = Propagation.MANDATORY)
# 调用方必须先有事务 否则抛 IllegalTransactionStateException

定时任务直接调用这个业务方法,抛 IllegalTransactionStateException 并提示找不到已存在的事务,走接口进来一切正常,单元测试也能过。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,MANDATORY 要求调用时外层必须已经有事务,定时任务和测试入口都没有事务,创建事务阶段就被拒绝。

围绕「MANDATORY 传播」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

处理上按这个顺序:改成 REQUIRED 或给调用方补一层事务;定时任务入口单独开事务再调用;检查调用链中间有没有把事务挂起。

改完只确认一件事:定时任务触发时不再抛异常,数据能正常写入表里。

作者 9823189