TM Lock

1867 ワード

TM Lock
TMロックはDMLテーブルロックを使用してテーブルを保護するロックである.
Empテーブル
select * from emp;

ここでempnoは1人のempのsalを1024に更新する.
(ちなみに、これは事前に更新された状態で、上のスクリーンショットに適用されます.)
これからは、このトランザクションをトランザクションAと呼びます.
update emp
set sal = 1024
where empno = 1;

これで正常に更新できます.まだ提出されていません.
このとき,empnoが1のempのsalを別の場所(新しいcmdウィンドウ)で4021に更新する.この取引は取引Bと呼ぶべきだ.
update emp
set sal = 1024
where empno = 1;
この照会は飛ぶと止まり、飛ばなくなった.トランザクションAはこのローをロックしているため、コミットされていません.
別のcmdウィンドウを開き、empnoが1のempのsalを0に更新しようとします.この取引は取引Cと呼ぶべきだ.
update emp 
set sal = 0 
where empno = 1;
このクエリのせいで、飛び出さずに停止することもあります.
モニタリング方法
現在の状況を確認すると、次のクエリを発行できます.
 SELECT DISTINCT T1.SESSION_ID
     , T2.SERIAL#
     , T4.OBJECT_NAME
     , T2.MACHINE
     , T2.TERMINAL
     , T2.PROGRAM
     , T3.ADDRESS
     , T3.PIECE
     , T3.SQL_TEXT
  FROM V$LOCKED_OBJECT T1
     , V$SESSION T2
     , V$SQLTEXT T3
     , DBA_OBJECTS T4
 WHERE 1=1
   AND T1.SESSION_ID = T2.SID
   AND T1.OBJECT_ID = T4.OBJECT_ID
   AND T2.SQL_ADDRESS = T3.ADDRESS
 ORDER BY T3.ADDRESS, T3.PIECE;
結果は以下の通りです.

一番下の2行のSQL TEXTでは、トランザクションAは未実行のUPDATEクエリをロックします.
COMMIT
現在のような状況は、事務Aが提出されていないことによるものである.今、事務Aに提出する予定です.
トランザクションAにコミットする場合、
事務B

取引C

トランザクションBでは、UPDATEクエリは破棄されます.取引Cは相変わらずです.トランザクションBは最初に実行されるため、上記の結果が得られる.