选择更新锁定

时间:2014-04-02 23:08:56

标签: sql oracle plsql select-for-update

我想阻止我的存储过程中的记录同时更新(通过多个会话)。

1.我是,对特定行使用SELECT FOR UPDATE语句,我想更新它。 这将锁定记录。

  1. 我正在更新此记录,然后提交它。因此锁定被释放,现在该记录可供另一个用户/会话使用。
  2. 然而,当我尝试运行该程序时,我发现同时更新正在发生,意味着SELECT FOR UPDATE无法正常工作。

    请提供一些建议。

    示例代码如下:

    IF THEN
    // do something
    ELSIF THEN
    BEGIN
    
     SELECT HIGH_NBR INTO P_NBR FROM ROUTE
     WHERE LC_CD = <KL_LCD> AND ROUTE_NBR =  <KL_ROUTE_NBR> 
     FOR UPDATE OF HIGH_NBR ;
    
     UPDATE ROUTE SET HIGH_NBR = (HIGH_NBR + 1) 
     WHERE LC_CD = <KL_LCD> AND ROUTE_NBR =  <KL_ROUTE_NBR>;
    
    COMMIT;
    
    END;
    
    END IF;
    

    在多用户环境中,我观察到没有发生SELECT FOR UPDATE锁定。

    我刚用两台不同的计算机(Sessions)测试了这个场景。这就是我所做的。

    1. 从一台计算机上执行SELECT FOR UPDATE语句 - 锁定一行。
    2. 从另一台计算机上,为同一记录执行UPDATE语句。
    3. 没有发生更新,即使经过很长时间,更新语句的Sql执行也没有完成。

      如果锁定被释放,我们是否会为记录发出SELECT FOR UPDATE。

1 个答案:

答案 0 :(得分:0)

首先,您需要在开始查询之前设置自动提交false。 并检查您的代码是否正常工作,您可以使用两个带有循环障碍的Java踏板 并且您还应该在代码上添加时间戳以检查代码的到达时间。