Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CRUDEPository本机查询在执行更新后选择*时给出旧值_Java_Mysql - Fatal编程技术网

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”
。更新后是否需要执行任何保存操作?如果是,保存什么命令?

您可能有两个不同的事务:

  • 某些标记为@Transactional的方法正在运行。此代码稍后将调用getJobStatus

  • 之后,从另一个线程调用updateManualRun,从而创建并提交另一个事务(注意,上面的方法仍在运行,另一个事务仍在打开)

  • 由于getJobStatus事务仍处于打开状态,因此无法看到启动后发生的更新

  • 如果是这种情况,那么每次都需要在单独的事务中调用getJobStatus

    如果你有服务

    @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();
         }
    }
    
    }