oracleによるロックの深化理解
ORACLEには以下のモードがあります。0:none 1:null空2:Row-S行共有(RS):共有テーブルロック3:Row-X行専用(RX):行の修正4:Share共有錠(S):他のDLL操作を阻止する5:S/Row-X共有行専用(SRX):他の事務操作を阻止する6:exclusive専用(X)があります。
数字が大きいほどロックレベルが高く、操作に影響が多いです。1級の鍵はあります。Selectは、v$locked_にあることがあります。objectが現れる。
2段ロックには、Select for udate、Lock For Update、Lock Row Share select for udateがあります。会話がfor udateのサブストリングを使ってカーソルを開くと、すべての戻りセットのデータラインが行レベル(Row-X)独占的にロックされます。他のオブジェクトはこれらのデータラインを調べて、udate、delete、select、またはselect forの操作を行うことができません。
3級ロックはあります。Insert、Update、Delete、Lock Row Exclusiveはcomitがない前に同じ記録を挿入したら反応がありません。後の3つのロックは前の3つのロックをずっと待っています。私達は前のロックを解除してから仕事を続けなければなりません。
4級ロックはあります。Create Index、ロックShare locked_modeは2,3,4でDLL操作に影響しませんが、DDL操作はora-00054エラーを提示します。
ORA-00054:resource busy and acquire with NOWAIT specified(ORA-00054:資源が忙しいが、NOWAIT方式で資源を取得することを指定します)
5級ロックは、ロックShare Row Exclusiveが具体的には、メインキー制約がある場合はudate/deleteがあります。4、5のロックが発生する可能性があります。
親表を修正すると、サブテーブルに対応する記録が存在すると、ORA-02292に異常が発生する。そうでなければ、親表にTXロックとRXロックだけを入れます。
サブテーブルを修正する場合、サブテーブルにTXロックとRXロックを加えた以外は、父の時計にSSロックをかけました。これは論理に合っています。父の時計はこの時に参考完備性を満たさなければなりません。つまり、親テーブルにSSロックをかけます。この時、親テーブルを修正しないようにします。
上のロックによる修正は、子の親テーブルに対して参照完全性があるフィールド操作です。
6段ロックは、Alter table、Drop table、Drop Index、Truncate table、ロックExclusiveがDBAキャラである:
上記のコマンドでプロセスを殺した後、プロセス状態は「killed」として設定されていますが、ロックされたリソースは長い間リリースされていませんので、Os 1レベルで該当プロセス(スレッド)を再度殺し、まず以下のステートメント取得プロセス(スレッド)番号を実行します。
数字が大きいほどロックレベルが高く、操作に影響が多いです。1級の鍵はあります。Selectは、v$locked_にあることがあります。objectが現れる。
2段ロックには、Select for udate、Lock For Update、Lock Row Share select for udateがあります。会話がfor udateのサブストリングを使ってカーソルを開くと、すべての戻りセットのデータラインが行レベル(Row-X)独占的にロックされます。他のオブジェクトはこれらのデータラインを調べて、udate、delete、select、またはselect forの操作を行うことができません。
3級ロックはあります。Insert、Update、Delete、Lock Row Exclusiveはcomitがない前に同じ記録を挿入したら反応がありません。後の3つのロックは前の3つのロックをずっと待っています。私達は前のロックを解除してから仕事を続けなければなりません。
4級ロックはあります。Create Index、ロックShare locked_modeは2,3,4でDLL操作に影響しませんが、DDL操作はora-00054エラーを提示します。
ORA-00054:resource busy and acquire with NOWAIT specified(ORA-00054:資源が忙しいが、NOWAIT方式で資源を取得することを指定します)
5級ロックは、ロックShare Row Exclusiveが具体的には、メインキー制約がある場合はudate/deleteがあります。4、5のロックが発生する可能性があります。
親表を修正すると、サブテーブルに対応する記録が存在すると、ORA-02292に異常が発生する。そうでなければ、親表にTXロックとRXロックだけを入れます。
サブテーブルを修正する場合、サブテーブルにTXロックとRXロックを加えた以外は、父の時計にSSロックをかけました。これは論理に合っています。父の時計はこの時に参考完備性を満たさなければなりません。つまり、親テーブルにSSロックをかけます。この時、親テーブルを修正しないようにします。
上のロックによる修正は、子の親テーブルに対して参照完全性があるフィールド操作です。
6段ロックは、Alter table、Drop table、Drop Index、Truncate table、ロックExclusiveがDBAキャラである:
col owner for a12
col object_name for a30
col machine for a32
col USERNAME for a16
col OSUSER for a16
現在のセッションのsidを表示: select sid from v$mysstat where rownum(=1) 現在のセッション状況を確認します。 select machine,username,sid,serial落,type,osuser,status from v$session; 現在のデータベースの中でロックされている状況を確認すると、次のようなSQL文が使えます。
select s.username,o.object_name,s.machine,s.sid,s.serial#,k.type
from v$locked_object l,dba_objects o ,v$session s,v$lock k
where l.object_id = o.object_id and l.session_id=s.sid and k.sid=s.sid
に長期的に出現した列があれば、解放されていないロックかもしれません。私達は次のSQL文で殺すことができます。長期にわたって非正常なロックを解放していません。ロックの問題があったら、あるDMM操作は長く待っても反応しないかもしれません。上記のコマンドでプロセスを殺した後、プロセス状態は「killed」として設定されていますが、ロックされたリソースは長い間リリースされていませんので、Os 1レベルで該当プロセス(スレッド)を再度殺し、まず以下のステートメント取得プロセス(スレッド)番号を実行します。
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=#sid (#sid sid)
4.OS上でこのプロセス(スレッド)を殺します。root IDで命令を実行します。windowsでorakillでスレッドを殺します。orakillはoracleから提供された実行可能命令です。文法はorakill sid threadです。中:sid:殺すプロセスが属することを示すインスタンス名thread:殺すスレッドの上にあるspideです。例:c:>orakill orcl〓spidはデータベースに直接接続する方式を採用しています。OSシステムでコマンド$kill process_を使用しないでください。numまたは$kill-9 process_numはユーザの接続を終了します。一つ以上のロックがユーザプロセスによって発生する可能性があるので、OSプロセスを殺します。rsとrxの違いはどこですか?Row Exclusive(RX):INSERT、UPATE、DELETERW Share(RS):SELECT…FOR UDATEの両方はTM table lock modes held by Dol trantionsです。やはり違いがあります。一つは違います。二つ目はrxロック後、他のtranspationsは変更後の結果さえ読めません。rsは他のtractionsにとって読むのは大丈夫です。だからrsと言います。表の面でPrvensactions from masully locking the tableのことですが、一つはfor exclusive reading or writingのことです。もう一つはfor exclusive write accessです。これはつまりrsのsの表現です。