0

ストアド プロシージャ内のレコードの (複数のセッションによる) 同時更新を防止したいと考えています。

1.私は、更新したい特定の行にSELECT FOR UPDATEステートメントを使用しています。これにより、レコードがロックされます。

  1. 私は今、このレコードを更新してからコミットします。したがって、ロックが解除され、別のユーザー/セッションが作業できるようになります。

ただし、プロシージャを実行しようとすると、同時更新が発生していることがわかります。これは、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. 1 台のコンピューターから、SELECT FOR UPDATE ステートメントを実行しました -- 行をロックしています。
  2. 別のコンピューターから、同じレコードに対して UPDATE ステートメントを実行します。
  3. 更新が行われず、更新ステートメントの SQL 実行が完了していません。

    レコードに対して SELECT FOR UPDATE を発行すると、いつロックが解除されますか。

4

1 に答える 1

0

まず、クエリを開始する前に自動コミットを false に設定する必要があります。コードが機能していることを確認するには、2 つの Java トレッドを循環バリアと共に使用できます。また、コードにタイムスタンプを追加して、コードに到達した時間を確認する必要があります。

于 2015-08-06T08:40:58.867 に答える