Java CRUDEPository本机查询在执行更新后选择*时给出旧值
我正在尝试使用本机查询更新Java CRUDEPository本机查询在执行更新后选择*时给出旧值,java,mysql,Java,Mysql,我正在尝试使用本机查询更新运行\u状态,如下所示: @Modifying @Transactional @Query(value = "update rerun_scheduler set RUN_STATUS=:runStatus where SCHED_NAME = :scheduleName and STEP_NAME = :stepName and MODEL_ID = :modelId and SUBMITTED_TIME = :submittedTime and START_TIME
运行\u状态
,如下所示:
@Modifying
@Transactional
@Query(value = "update rerun_scheduler set RUN_STATUS=:runStatus where SCHED_NAME = :scheduleName and STEP_NAME = :stepName and MODEL_ID = :modelId and SUBMITTED_TIME = :submittedTime and START_TIME = :startTime", nativeQuery = true)
int updateManualRun(@Param("scheduleName") String scheduleName, @Param("stepName") String stepName, @Param("modelId") String modelId, @Param("submittedTime") long submittedTime, @Param("startTime") long startTime, @Param("runStatus") String runStatus);
我可以使用Mysqlworkbench
查看表中更新的值。但在我的代码中,当我尝试读取作业状态时,如下所示:
@Query(value = "Select * from rerun_scheduler where SCHED_NAME = :scheduleName and MODEL_ID=:modelId and SUBMITTED_TIME=:submittedTime AND RUN_NUMBER = :runNumber", nativeQuery = true)
RerunDTO getJobStatus(@Param("scheduleName") String scheduleName, @Param("modelId") String modelId, @Param("submittedTime") Long submittedTime, @Param("runNumber") int runNumber);
RUN\u STATUS
中的旧值是“TO\u DO”
当我更新它时,我将它更改为“COMPLETE”。但是当我进行Select*query
时,我仍然得到RUN\u状态
作为“TO\u DO”
。更新后是否需要执行任何保存操作?如果是,保存什么命令?您可能有两个不同的事务:
@Service
class MyService {
@Autowired
JobStatusDao dao;
@Transactional
public void checkStatus() {
Boolean isFound=false;
while (!isFound) {
isFound=dao.getJobStatus() != null;
}
}
}
您可能想创建另一个服务(注意,在同一个服务中,有可能仅仅创建另一个带有@Transactional的方法,但这不起作用,请选中此项)
然后您需要重新编写原始服务:
@Service
class MyService {
@Autowired
JobStatusService service;
public void checkStatus() {
Boolean isFound=false;
while (!isFound) {
isFound=service.checkStatus();
}
}
}
顺便说一句,请注意,在while循环中查询DB将创建一个合适的负载。
您应该在检查之间增加一些延迟 谢谢。看来这就是问题所在。但是有没有办法每次都创建一个新的事务。因为,我的代码正在while循环中运行并检查状态更新。在处于“完成”状态之前,循环不会退出。正如您所说,另一个事务将更新状态。每次调用标记为@Transactional的方法时(如果没有现有事务),都会打开新事务。所以,您只需要调用这样的方法。我会很快用例子更新我的答案。我按照你的建议做了更改,但运气不好。我仍然无法获取状态中的更新值。
@Service
class MyService {
@Autowired
JobStatusService service;
public void checkStatus() {
Boolean isFound=false;
while (!isFound) {
isFound=service.checkStatus();
}
}
}