何故かテーブルロックとなっていました。
あるプログラムにて同時に実行した場合、
更新するキーは違うのでロックしないと思っていましたが何故かロックしました。
ロック状態の確認は、以下のSQLにて確認出来ます。
SELECT V$SESSION.SID
,V$SESSION.SERIAL#
,SUBSTR(V$SESSION.MACHINE,1,20 )
,SUBSTR(V$SESSION.PROGRAM,1,20 )
,V$SESSION.USERNAME
,V$SESSION.COMMAND
,V$SESSION.LOGON_TIME
,V$TRANSACTION_ENQUEUE.LMODE
,V$TRANSACTION_ENQUEUE.REQUEST
,V$TRANSACTION_ENQUEUE.BLOCK
FROM V$TRANSACTION_ENQUEUE
,V$SESSION
WHERE V$SESSION.SID = V$TRANSACTION_ENQUEUE.SID
/*
項目 COMMAND :実行中のコマンド
�� INSERT、3 SELECT、6 UPDATE、7 DELETE
項目 LMODE :セッションがロックを保持している状態
�� なし、1 NULL、2 行共有、3 行ロック
�� 共有、5 共有/行ロック、6 表ロック
*/
ロックしたテーブルSQLを調査してみると、プロセスAにてテーブルAにINNSERTすると、
プロセスBではテーブルAにINSERTすることが出来ませんでした。
Oracleは基本的に行ロックであり、キーの違うINSERTならロックされないはずです。
これが同一キーの場合は、2回目のINSERTがロックされるのは正しい動作ですが
キーが違うはずなのにロックされてしまいます。
原因は、行ロックではなくテーブルロックしている為だったのですが、
テーブルロックになる理由がわかりませんでした。
そこで、テーブルロックとなる原因を調査すると2パターンありました。
1、親子関係のあるテーブルで親を更新しそれに関連する子テーブル。
��、ダイレクト・パス・インサートの設定をしてある場合。
今回の場合は、ダイレクト・パス・インサートの設定が原因でした。
後から参加したシステムなので何故ダイレクト・パス・インサートの設定がしてあるか
わからないし、データベースの設定なので一人で解決できないので他の人に投げて完了です。
0 件のコメント:
コメントを投稿