ストアド プロシージャ内のレコードの (複数のセッションによる) 同時更新を防止したいと考えています。
1.私は、更新したい特定の行にSELECT FOR UPDATEステートメントを使用しています。これにより、レコードがロックされます。
- 私は今、このレコードを更新してからコミットします。したがって、ロックが解除され、別のユーザー/セッションが作業できるようになります。
ただし、プロシージャを実行しようとすると、同時更新が発生していることがわかります。これは、SELECT FOR UPDATE が正常に機能していないことを意味します。
Pls はいくつかの提案を提供します。
サンプルコードは以下の通りです:
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 ロックが発生していないことを確認しています。
2 台の異なるコンピューター (セッション) でシナリオをテストしました。これが私がやったことです。
- 1 台のコンピューターから、SELECT FOR UPDATE ステートメントを実行しました -- 行をロックしています。
- 別のコンピューターから、同じレコードに対して UPDATE ステートメントを実行します。
更新が行われず、更新ステートメントの SQL 実行が完了していません。
レコードに対して SELECT FOR UPDATE を発行すると、いつロックが解除されますか。