0

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

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

  1. 我现在正在更新此记录,然后提交它。所以锁被释放,现在记录可供另一个用户/会话使用。

但是,当我尝试运行该程序时,我发现正在同时更新,这意味着 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 锁没有发生。

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

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

    如果我们为一条记录发出 SELECT FOR UPDATE ,什么时候会释放锁。

4

1 回答 1

0

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

于 2015-08-06T08:40:58.867 回答