先看例子
@Transactional
public Result methodA(Long id) {
Result result = new Result();
WorkOrderEntity entity1 = workOrderRepository.findById(id).get();
//更新前對(duì)象的status是1,
workOrderRepository.updateWorkOrderStatus(id, 2);
// entity.setOrderStatus(OrderStatusEnum.FINISHED.getCode());
// workOrderRepository.save(entity);
WorkOrderEntity entity2 = workOrderRepository.findByIdAndStatus(id, 2)
//此處根據(jù)更新后的status=2能查詢出記錄,但是entity中的status狀態(tài)卻是舊的status=1
...
return result;
}
在同一個(gè)事務(wù)中,先更新再根據(jù)更新后的字段查詢,查詢條件是更新之后的吧享,但是查詢結(jié)果是更新前的;
問(wèn)題分析
上面例子用的是自定義的update語(yǔ)句譬嚣,在jpa中是不會(huì)刷新緩存的钢颂,也就是entity還是同一個(gè)對(duì)象,所以更新結(jié)果并沒(méi)有刷新,entity2.status=1拜银;
如果換成原生的save()方法殊鞭,jpa會(huì)刷新緩存,entity就不是同一個(gè)對(duì)象尼桶,entity2.status=2
但是為什么根據(jù)status=2能查出entity.status=1的記錄钱豁?百思不得其解