Oracle TXロック(トランザクション・ロック)
トランザクションロックとも呼ばれます.各トランザクションには1つしかありません.各トランザクションペアにはTXロックが必要です.このトランザクションで変更またはselect for updateの各行がこのロックを指します(データブロックの構造に関連するフラグがあります).あるトランザクションが変更したいレコードが別のトランザクションにロックされている場合、このトランザクションは待機し、またトランザクションがリストを形成する場合は、待機情報はv$lockで調べることができます.
実験データの準備:
LMODEは6代表排他ロック、REQUESTは0代表が既に取得している.
ブロックされる.
SIDが35のSESSIONには、要求されたロックと、ブロックされたロックの2つが表示されます.自己接続の表示:
SESSION 1:提出
SESSION 3:ブロックが解除され、更新に成功しました.
SESSION 2:セッション1のロックが解除されました.
実験をする(TOMの本の197ページで)
実験データの準備:
SCOTT@ prod> create table emp2 as select * from emp ;
Table created.
SCOTT@ prod> create table dept2 as select * from dept ;
Table created.
SCOTT@ prod> alter table dept2 add primary key (deptno ) ;
Table altered.
SCOTT@ prod> alter table emp2 add primary key (empno ) ;
Table altered.
SCOTT@ prod> alter table emp2 add foreign key ( deptno ) references dept2(deptno) ;
Table altered.
SCOTT@ prod> create index idx111 on emp2(deptno ) ;
Index created.
SESSION1:
SCOTT@ prod> update dept2 set dname = initcap(dname) ;
4 rows updated.
SESSION2:
SYS@ prod> select username , v$lock.sid , trunc(id1/power(2,16)) rbs , bitand(id1 , to_number('ffff' , 'xxxx' )) + 0 slot ,
2 id2 seq , lmode , request
3 from v$lock , v$session
4 where v$lock.type = 'TX' and v$lock.sid = v$session.sid and v$session.username = 'SCOTT' ;
USERNAME SID RBS SLOT SEQ LMODE REQUEST
------------------------------ ---------- ---------- ---------- ---------- ---------- ----------
SCOTT 32 3 16 1735 6 0
SYS@ prod> select xidusn , xidslot , xidsqn from v$transaction ;
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
3 16 1735
LMODEは6代表排他ロック、REQUESTは0代表が既に取得している.
SESSION3:
SCOTT@ prod> update emp2 set ename = upper(ename) ;
14 rows updated.
SCOTT@ prod> update dept2 set deptno = deptno - 10 ;
ブロックされる.
SESSION2:
SYS@ prod> select username , v$lock.sid , trunc(id1/power(2,16)) rbs , bitand(id1 , to_number('ffff' , 'xxxx' )) + 0 slot ,
2 id2 seq , lmode , request from v$lock , v$session
3 where v$lock.type = 'TX' and v$lock.sid = v$session.sid and v$session.username = 'SCOTT' ;
USERNAME SID RBS SLOT SEQ LMODE REQUEST
------------------------------ ---------- ---------- ---------- ---------- ---------- ----------
SCOTT 35 3 16 1735 0 6
SCOTT 35 2 14 1754 6 0
SCOTT 32 3 16 1735 6 0
SYS@ prod> select xidusn , xidslot , xidsqn from v$transaction ;
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
2 14 1754
3 16 1735
SIDが35のSESSIONには、要求されたロックと、ブロックされたロックの2つが表示されます.自己接続の表示:
SYS@ prod> select ( select username from v$session where sid = a.sid ) blocker , a.sid ,
2 ' is blocking ' ,
3 ( select username from v$session where sid = b.sid ) blockee ,
4 b.sid
5 from v$lock a , v$lock b
6 where a.block = 1 and b.request > 0 and a.id1 = b.id1 and a.id2 = b.id2 ;
BLOCKER SID 'ISBLOCKING' BLOCKEE SID
------------------------------ ---------- ------------- ------------------------------ ----------
SCOTT 32 is blocking SCOTT 35
SESSION 1:提出
SCOTT@ prod> commit ;
Commit complete.
SESSION 3:ブロックが解除され、更新に成功しました.
4 rows updated.
SESSION 2:セッション1のロックが解除されました.
SYS@ prod> select username , v$lock.sid , trunc(id1/power(2,16)) rbs , bitand(id1 , to_number('ffff' , 'xxxx' )) + 0 slot ,
2 id2 seq , lmode , request from v$lock , v$session
3 where v$lock.type = 'TX' and v$lock.sid = v$session.sid and v$session.username = 'SCOTT' ;
USERNAME SID RBS SLOT SEQ LMODE REQUEST
------------------------------ ---------- ---------- ---------- ---------- ---------- ----------
SCOTT 35 2 14 1754 6 0
SYS@ prod> select xidusn , xidslot , xidsqn from v$transaction ;
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
2 14 1754