锁定数据库行

时间:2018-02-06 10:45:28

标签: sql multithreading oracle locking

我的数据库中有一个包含已定义作业的表。其中一个jobs属性是status,可以是[waiting,in_progress,done]。为了处理作业,我已经定义了两个服务器之间的主工关系,它们按以下方式工作:

  1. master查找数据库中的第一条记录状态' wait'并触发工作服务器处理该作业。
  2. 被触发的工作人员将作业状态设置为' in_progress'在一个事务中并开始执行作业(同时服务器正在寻找具有状态'等待'并触发另一个工作人员的下一个工作)
  3. 当工作完成时,工作人员将工作状态设置为“完成”
  4. 这是一个完美的案例场景,但是在工作执行期间可能会发生一个工人死亡。在这种情况下,需要重新启动作业,但是除了在数据库中检查其状态之外,master无法验证作业是否已完成(' done')。因此,如果工人死亡,在数据库中该工作仍处于状态' in_progress'并且服务器不知道工作人员死亡并且该工作需要重新启动。 (我们无法从工人那里获得任何反馈,我们无法对其进行ping操作,也无法获取他目前正在处理的工作信息)

    我解决这个问题的想法是:

    1. 工人将工作状态改为' in_progress' (交易已提交)他会打开一个锁定特定工作的新交易。
    2. 师父,在寻找工作开始时,会寻找“等待”的工作。和' in_progress'哪些没有锁定
    3. 如果工作人员死亡,事务将中断,从数据库中的作业记录释放锁定,并且master将重新处理它。
    4. 现在我正在寻找一种方法来验证它确实会有效。可能在SQL开发人员(两个实例)中使用SQL sctipt,我希望这可以通过以下方式工作:

      实例1:

      1. 打开事务并在row_1上创建行锁
      2. 睡5分钟
      3. 释放锁定
      4. 实例2:

        1. 打开事务并查找行匹配条件(row_1和row_2匹配条件)
        2. 返回选定的行
        3. 然后我会杀死实例1 以模拟工作人员死亡并再次运行实例2.

          请告知我的方法是否正确

          P.S 你还能指点我一些很好的解释如何创建脚本表格实例1

0 个答案:

没有答案