在Java中使用任务调度程序更新表时,行被锁定



我用Java编写了一个任务调度程序,它每分钟调用一次方法。现在,这个应用程序被部署到SIT服务器中,SIT服务器上有2个实例在运行。现在,让我告诉你我构建的场景。

<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="myBean" method="takeLunch" fixed-delay="60000" />
</task:scheduled-tasks>
<task:scheduler id="myScheduler"/>

流量为

  1. 让准备好吃午饭的员工。这就是合格条件。

    SELECT EMP_ID FROM EMPLOYEES WHERE WORK_STATUS='COMPLETED' 
    

    (这里是否会因为两个实例都试图同时激发查询而出现死锁?(

  2. 我有另一张桌子叫";"LUNCH_ STATUS";我会在那里记录他们的午餐。

    INSERT INTO LUNCH_STATUS(EMP_ID,STATUS) .....
    

    在这里,所有员工ID都将被插入,状态为空。

  3. 我将从状态为空的LUNCH_ STATUS获得第一个员工;午餐进行中";

  4. 在吃午饭的时候,我有一些商业逻辑,一旦午饭吃完,我会把状态更新为"完成";

    UPDATE LUNCH_STATUS SET STATUS='COMPLETED' WHERE EMP_ID  = ?
    
  5. 更新完成后,我应该更新主表EMPLOYEES

    UPDATE EMPLOYEES SET WORK_STATUS='WORK RESUMED' WHERE EMP_ID=?
    

    当我在本地机器上运行时,这可以很好地工作,但有时在SIT服务器上则不行。

现在,这里的问题是,有时当多名员工有资格领取午餐时,即使流程已经完成,应用程序也不会更新为午餐完成状态。某个地方的记录被锁定了。有什么想法我应该考虑哪些步骤吗?

我将@Transactional注释和隔离属性作为SERIALIZABLE用于所有这些DAO方法(INSERT、SELECT和UPDATE(。

您必须实现一个集群环境石英调度器。例如在带有数据库的GitHub中。

单击此处https://github.com/faizakram/Application

最新更新