📊
【Oracle】待機イベントの行ロックを再現する
待機イベントの行ロックを再現します(学習目的)。
なお、本記事は、書籍『オラクルマスター教科書 Gold DBA Oracle Database AdministrationⅡ』を参考に作成しています。
検証環境
- 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