ロックに関する検証 その3
~ロックに関する検証 その3~
ペンネーム ちゃむ
前回は、ロックが悪さをする場合について説明した。
今回は、トランザクションロックに関して検証を行う。
検証には、以下のテーブル a を使用する。
SQL> create table a maxtrans 1 as select * from emp;
maxtransというものは、あまり指定してテーブルを作成しない場合が多いであ
ろう。これは、データブロック中のトランザクションエントリのMAX値を決める
ものである。以前、ロールバック・セグメントの検証のときに、以下のような
テーブルのブロックダンプを紹介したと思う。その時は、Xidがトランザクショ
ン表のスロットの場所を示すことなどの説明をした。
Itl Xid Uba Flag Lck Scn/Fsc 0x01 xid: 0x0009.003.00000076 uba: 0x040004c0.0131.06 ---- 1 fsc 0x0000.00000000 0x02 xid: 0x0000.000.00000000 uba: 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000 0x03 xid: 0x0000.000.00000000 uba: 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
maxtransを1に設定すると、上記のトランザクションエントリは1行しか確保さ
れなくなる。つまり、2行以上格納しようとすると待ちが生じるというわけだ。
では、その待ちが発生している様子を見てみよう。
セッションA
SQL> update a set ename = 'osamu' where empno = 7499 ; 1行が更新されました。
セッションB
SQL> update a set ename = 'osamu' where empno = 7369 ; 「待たされているよ~~~~~~~~~~」
この時の、V$LOCKの様子は以下の通りである。
SQL> SELECT SID,TYPE,ID1,ID2,LMODE,REQUEST,CTIME,BLOCK FROM V$LOCK WHERE TYPE IN ('TM','TX') ; SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK --------- -- --------- --------- --------- --------- --------- --------- 11 TX 524289 160 6 0 49 1 11 TM 5570 0 3 0 49 0 12 TM 5570 0 3 0 34 0 12 TX 524289 160 0 4 34 0
これは、SID(セッションID)=12がSID=11に待たされていることを示めす。REQUEST
にO以外の数字が入っているものがロックを獲得できずに待たされているもの、
LMODEにO以外の数字が入っているものがロックを獲得しているものを示す。
LMODE、REQUESTの数字の意味については、前々回のV$LOCKの項目説明の以下に参
照してほしい。
ロックモードにおける、待つ、待たせるの関係を以下に示す。
ロックモードの図を用いて今回の現象を説明すると、SID=11のTYPE=TXの行は、
LMODE=6、つまり排他(X)でロックを取得しているため、REQUEST=4で後からロッ
ク要求をしてきたセッションを待たせているということになる。
maxtransは通常、あえて設定する場合はまずないであろう。
デフォルトは121であるが、実際はDB_BLOCK_SIZEによって最大値が決まる。
DB_BLOCK_SIZE 最大値 ------------- ------ 2k 41 4k 84 8k 169
トランザクションエントリに関連したもう一つのパラメータinittransは、設定
する場面もでてくるであろう。inittransは、トランザクションエントリの初期
値を設定するものである。つまり、事前に「この分だけトランザクションエント
リを格納する領域を確保する」ときに使う。
特に、複数セッションからINSERTなどが多発するテーブルなどでinittransを設
定する場合があるが、これに関しては、pctfreeの設定と関連させて、一緒に検
証しようと思う。
以上 茅ヶ崎にて