前言:接收单据的接口,失败了上游系统会定时补发,一分钟一次。 我们接过来之后如果执行失败了会重新执行三次。
红色的三条报了同样的错误,都是在一个 查询数据的地方
commonDao.findByQuery(orderDetail.class, id);
在执行上面呢个方法前,会有一个
commonDao.save(orderDatail);
往 findByQuery 底层代码看 会有一个 HiberNateTemplate.execute 再往下看 ,
会有 HiberNateTemplate.doExecute 的方法。
他在执行 save的时候其实没有将事务提交,但是在 execute 、doExecute 这里会提交所有事务,这会导致第一个重新执行的提交成功(绿色框的),后面同时执行的提交失败(红色框的)。
其实这里报这个错误就不用特殊处理了,因为数据已经有个报文接进来了。