我想阻止我的存储过程中的记录同时更新(通过多个会话)。
1.我是,使用SELECT FOR UPDATE语句为特定行,我想更新它。这将锁定记录。
但是,当我尝试运行该过程时,我发现同时更新正在发生,意味着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)测试了这个场景。这就是我所做的。
首先,您需要在开始查询之前设置自动提交false。并检查您的代码是否正常工作,您可以使用两个带有循环屏障的Java踏板,还应该在代码上添加时间戳以检查代码的到达时间。