Oracleデータベースでデッドロック・プロセスを終了する一般的な方法について説明します.
3056 ワード
1、デッドロックの表示1)dbaユーザによる次の文の実行
出力の結果があれば、デッドロックがあり、デッドロックが見える機器はどれかを示します.フィールドの説明:Username:デッドロック文で使用されるデータベース・ユーザー;Lockwait:デッドロックの状態で、内容があればデッドロックされていることを示します.Status:ステータス、activeはデッドロックされたMachine:デッドロック文が存在するマシンを表します.Program:デッドロックを生成する文は主にどのアプリケーションから来ますか
2)dbaユーザで次の文を実行し、デッドロックされた文を表示できます.
2、デッドロックの解決方法1)デッドロックのプロセスを探す:
2)killがこのデッドロックを落とすプロセス:
3)解決できない場合:
sidはデッドロックsidで置き換えられます.
--ORACLEはチェックリストです.SYSTEMが必要です.SYS(権限のあるユーザー)は次のSQL文を実行すればロックコードを表示できます.
3、デッドロックを避ける2つのトランザクションが同じテーブルのセットにアクセスする必要がある場合、2つのトランザクションで同じ順序でこのテーブルのセットをロックすると、通常、複数のテーブルのデッドロックを回避できます.たとえば、システム内のプライマリ・テーブルと集計表の両方を更新する必要がある場合、開発者は、プライマリ・テーブルにロックをかけてから集計表にロックをかけるなどのルールに従う必要があります.このようなルールを注意深く設計し、厳格に実行すれば、デッドロックの発生を根本的に根絶することができる.開発者が同じトランザクション内で一連のリソースをロックする必要があることを事前に知っている場合は、まず排他性が最も高いリソースをロックすることを考慮する必要があります.
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つのトランザクションで同じ順序でこのテーブルのセットをロックすると、通常、複数のテーブルのデッドロックを回避できます.たとえば、システム内のプライマリ・テーブルと集計表の両方を更新する必要がある場合、開発者は、プライマリ・テーブルにロックをかけてから集計表にロックをかけるなどのルールに従う必要があります.このようなルールを注意深く設計し、厳格に実行すれば、デッドロックの発生を根本的に根絶することができる.開発者が同じトランザクション内で一連のリソースをロックする必要があることを事前に知っている場合は、まず排他性が最も高いリソースをロックすることを考慮する必要があります.