我想阻止我的存储过程中的记录同时更新(通过多个会话)。
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)测试了这个场景。这就是我所做的。
没有发生更新,即使经过很长时间,更新语句的Sql执行也没有完成。
如果锁定被释放,我们是否会为记录发出SELECT FOR UPDATE。
答案 0 :(得分:0)
首先,您需要在开始查询之前设置自动提交false。 并检查您的代码是否正常工作,您可以使用两个带有循环障碍的Java踏板 并且您还应该在代码上添加时间戳以检查代码的到达时间。