TM Lock
1867 ワード
TM Lock
TMロックはDMLテーブルロックを使用してテーブルを保護するロックである.
Empテーブル
ここでempnoは1人のempのsalを1024に更新する.
(ちなみに、これは事前に更新された状態で、上のスクリーンショットに適用されます.)
これからは、このトランザクションをトランザクションAと呼びます.
これで正常に更新できます.まだ提出されていません.
このとき,empnoが1のempのsalを別の場所(新しいcmdウィンドウ)で4021に更新する.この取引は取引Bと呼ぶべきだ.
別のcmdウィンドウを開き、empnoが1のempのsalを0に更新しようとします.この取引は取引Cと呼ぶべきだ.
モニタリング方法
現在の状況を確認すると、次のクエリを発行できます.
一番下の2行のSQL TEXTでは、トランザクションAは未実行のUPDATEクエリをロックします.
COMMIT
現在のような状況は、事務Aが提出されていないことによるものである.今、事務Aに提出する予定です.
トランザクションAにコミットする場合、
事務B
取引C
トランザクションBでは、UPDATEクエリは破棄されます.取引Cは相変わらずです.トランザクションBは最初に実行されるため、上記の結果が得られる.
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は最初に実行されるため、上記の結果が得られる.
Reference
この問題について(TM Lock), 我々は、より多くの情報をここで見つけました https://velog.io/@jduckling_1024/TM-Lockテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol