ロックに関する検証 その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の設定と関連させて、一緒に検
証しようと思う。

以上 茅ヶ崎にて