选择更新锁定

问题描述 投票:0回答:1

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

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锁没有发生。

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

  1. 从一台计算机上执行SELECT FOR UPDATE语句 - 锁定一行。
  2. 从另一台计算机,为同一记录执行UPDATE语句。
  3. 没有发生更新,即使经过很长时间,更新语句的Sql执行也没有完成。 什么时候释放锁,如果我们为记录发出SELECT FOR UPDATE。
sql oracle plsql select-for-update
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.