Oracleデータベースでデッドロック・プロセスを終了する一般的な方法について説明します.

3056 ワード

1、デッドロックの表示1)dbaユーザによる次の文の実行

select username,lockwait,status,machine,program from v$session where sid in
 (select session_id from v$locked_object)

出力の結果があれば、デッドロックがあり、デッドロックが見える機器はどれかを示します.フィールドの説明:Username:デッドロック文で使用されるデータベース・ユーザー;Lockwait:デッドロックの状態で、内容があればデッドロックされていることを示します.Status:ステータス、activeはデッドロックされたMachine:デッドロック文が存在するマシンを表します.Program:デッドロックを生成する文は主にどのアプリケーションから来ますか
2)dbaユーザで次の文を実行し、デッドロックされた文を表示できます.

select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))

2、デッドロックの解決方法1)デッドロックのプロセスを探す:

SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;

2)killがこのデッドロックを落とすプロセス:

alter system kill session ‘sid,serial#'; (  sid=l.session_id)

3)解決できない場合:

select pro.spid from v$session ses,
v$process pro
where
ses.sid=XX
and ses.paddr=pro.addr;

sidはデッドロックsidで置き換えられます.
--ORACLEはチェックリストです.SYSTEMが必要です.SYS(権限のあるユーザー)は次のSQL文を実行すればロックコードを表示できます.

SELECT sn.username,
    m.SID,
    sn.SERIAL#,
    m.TYPE,
    DECODE(m.lmode,
       0,
       'None',
       1,
       'Null',
       2,
       'Row Share',
       3,
       'Row Excl.',
       4,
       'Share',
       5,
       'S/Row Excl.',
       6,
       'Exclusive',
       lmode,
       LTRIM(TO_CHAR(lmode, '990'))) lmode,
    DECODE(m.request,
       0,
       'None',
       1,
       'Null',
       2,
       'Row Share',
       3,
       'Row Excl.',
       4,
       'Share',
       5,
       'S/Row Excl.',
       6,
       'Exclusive',
       request,
       LTRIM(TO_CHAR(m.request, '990'))) request,
    m.id1,
    m.id2
 FROM v$session sn, v$lock m
 WHERE (sn.SID = m.SID AND m.request != 0) --     ,     
  OR (sn.SID = m.SID --      ,                 
    AND m.request = 0 AND lmode != 4 AND
    (id1, id2) IN (SELECT s.id1, s.id2
             FROM v$lock s
            WHERE request != 0
             AND s.id1 = m.id1
             AND s.id2 = m.id2))
 ORDER BY id1, id2, m.request;


3、デッドロックを避ける2つのトランザクションが同じテーブルのセットにアクセスする必要がある場合、2つのトランザクションで同じ順序でこのテーブルのセットをロックすると、通常、複数のテーブルのデッドロックを回避できます.たとえば、システム内のプライマリ・テーブルと集計表の両方を更新する必要がある場合、開発者は、プライマリ・テーブルにロックをかけてから集計表にロックをかけるなどのルールに従う必要があります.このようなルールを注意深く設計し、厳格に実行すれば、デッドロックの発生を根本的に根絶することができる.開発者が同じトランザクション内で一連のリソースをロックする必要があることを事前に知っている場合は、まず排他性が最も高いリソースをロックすることを考慮する必要があります.