アプリケーションで断続的にデッドロックが発生します。私のアプリケーションには EMPLOYEE (ID (PK), NAME, SAL) などの 1 つのテーブルがあり、2 つのセッションがあります。
セッション 1:
SELECT ID, NAME, SAL FROM EMPLOYEE WHERE SAL = (SELECT MIN(SAL) FROM
EMPLOYEE) FOR UPDATE
Let say the query return EMPLOYEE ROW having ID=2
then application does some processing like rs.updateInt(ID_SAL, 10);
セッション 2: (その他のビジネス ロジック用)
SELECT ID, NAME, SAL FROM EMPLOYEE WHERE ID=2 FOR UPDATE.
したがって、アプリケーションでは、両方のセッションが同じ行を更新しようとします (例では ID=2 の行)。このような状況は予想されるため、SELECT .. FOR UPDATE が役立つと考えました。
私は何か間違ったことをしていますか?SELECT FOR UPDATE が行をロックし、他のセッションが同じ行を更新しようとすると、セッション 1 の実行が完了するまで待機すると想定しています。