📊

【Oracle】待機イベントの行ロックを再現する

2024/06/23に公開

待機イベントの行ロックを再現します(学習目的)。

なお、本記事は、書籍『オラクルマスター教科書 Gold DBA Oracle Database AdministrationⅡ』を参考に作成しています。
https://www.shoeisha.co.jp/book/detail/9784798174365

検証環境

  • Oracle Database 19c for Linux
  • Oracle VM VirtualBox

事前準備

準備は以下の通りです。

  • セッション1、2...任意のユーザーでSQL*Plusにログイン
  • セッション3...SYSユーザーでSQL*Plusにログイン
  • 任意のテーブル...任意のユーザーであらかじめ作成しておきます

今回は以下のテーブルを用意しています。あらかじめ実行しておきます。
なお、任意のユーザーは「TESTUSER」としています。

CREATE TABLE TEST_TABLE_1 (
    ID NUMBER PRIMARY KEY,
    NAME VARCHAR2(50)
);
INSERT INTO TEST_TABLE_1 (ID, NAME) VALUES (1, 'TARO');
COMMIT;

待機イベント(行ロック)の再現

以降の手順をそれぞれのセッションで実行してください。

◆セッション1

SQL> UPDATE TEST_TABLE_1 SET NAME='CHANGE_1' WHERE ID=1;

1行が更新されました。

◆セッション2

SQL> UPDATE TEST_TABLE_1 SET NAME='CHANGE_2' WHERE ID=1;

「1行が更新されました。」や「SQL>」のプロンプトが表示されません。

▼ 実際の画面

◆セッション3(SYSユーザー)

V$SESSIONビューで、現在発生している待機イベントを確認します。

SQL> SELECT sid, event, state FROM V$SESSION WHERE username='TEST_USER';

       SID EVENT                               STATE
---------- ----------------------------------- -------------------
        40 enq: TX - row lock contention       WAITING
       277 SQL*Net message from client         WAITING

enq: TX - row lock contention」が記述されています。
同じ行に対して変更処理を実行しているため、行ロックが発生しました。

◆セッション1

SQL> COMMIT;

コミットが完了しました。

◆セッション2

セッション1でCOMMITが完了すると、行ロックが解除され、セッション2のUPDATE文が実行されます。

SQL> UPDATE TEST_TABLE_1 SET NAME='CHANGE_2' WHERE ID=1;

1行が更新されました。

◆セッション3(SYSユーザー)

SQL> SELECT sid, event, state FROM V$SESSION WHERE username='TEST_USER';

       SID EVENT                               STATE
---------- ----------------------------------- -------------------
        40 SQL*Net message from client         WAITING
       277 SQL*Net message from client         WAITING

「enq: TX - row lock contention」がなくなりましたね。行ロックが解除されました。

以上で、待機イベント(行ロック)の再現手順の紹介は終了です。

Discussion