앞선 테스트를 통해 parent와 child 테이블에 대한 DML 순서에 따른 TM Lock 경합 발생 여부에 대해 살펴보았음
h2.Converters 리스트 활용테스트

<<Session #134>>


--object ID확인
SQL> select object_name,object_id from dba_objects where object_name in ('PARENT','CHILD');
OBJECT_NAME      OBJECT_ID  
---------------- -----------
CHILD                  59054
PARENT                 59052

2 rows selected.


SQL> insert into child values(3,'c3',3);

SQL> select *from v$lock where sid in(136,134);

ADDRKADDRSIDTYID1ID2LMODEREQUESTCTIMEBLOCK
000007FF479F3EE8000007FF479F3F10134TM59052020720
000007FF479F3FE8000007FF479F4010134TM59054030720

@chk_lock
SQL> select a.sid,b.object_name,a.type,a.id1,a.id2,a.lmode,a.request,a.block
from v$lock a, dba_objects b
where a.sid in(134,136)
and  a.type ='TM'
and a.id1=b.object_id(+)
order by sid;

SIDOBJECT_NAMETYID1ID2LMODEREQUESTBLOCK
134CHILDTM590540300
134PARENTTM590520200

child 테이블에대해서는 RX(3) 모드로 Parent 테이블에대해서는 RS(2)모드로 TM락 소유

<<Session #136>>


insert into child values(3,'C3',3);
@chk_lock

SIDOBJECT_NAMETYID1ID2LMODEREQUESTBLOCK
134PARENTTM590520200
134CHILDTM590540300
136CHILDTM590540300
136PARENTTM590520200

134,136세션 각각 child 테이블에 대해서는 RX(3) mode로 Parent 테이블에 대해서는 RS(2)모드로 TM락을 소유

<<Session #134>>


delete parent where id = 4;

이때 134번세션에서 parent 테이블에대한 delete 작업을 하게 될 경우 ,134번세션은 child 테이블에 대해 S(4)모드의 TM락이 필요
그러나 이미 134번세션은 child 테이블에대해 RX(3)모드의 TM락을 소유중
이러한 경우 134번세션은 기존 RX(3)모드의 TM락을 릴리즈한 후에 다시 S(4) 모드로 TM락을 요청할수 없으므로 Lock Conversion을 수행
즉 기존의 RX+S=SRX(5)모드의 TM락을 획득시도
chk_lock결과를 확인해보면 이렇게 lock conversion이 필요한 경우 WAT(Waiters)리스트가아닌 CON(Convers)리스트에서 대기세션을 관리


@chk_lock

SIDOBJECT_NAMETYID1ID2LMODEREQUESTBLOCK
134PARENTTM590520300
134CHILDTM590540350
136CHILDTM590540301
136PARENTTM590520200