事务方法里用异步线程查刚插入的记录,主键都拿到了,子线程 select 却返回 null,等接口返回后再查又有数据。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,事务没提交时别的连接看不到未提交数据,子线程拿的是另一条连接,读到的还是旧快照。
碰到「事务未提交查询」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronization() {
public void afterCommit() { send(id); }
});
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。
具体做法是,把查询挪到事务提交之后执行;用 afterCommit 回调触发后续动作;或直接传结果对象不再回查数据库。
最后用这个标准收尾,异步任务在提交后触发,子线程能查到这条记录。
