気ままなコメント >> Oracle >> Oracleは行ロック

Oracleは行ロック

| コメント(0) | トラックバック(0)

Oracleは基本的に行ロックのはずですが
何故かテーブルロックとなっていました。

あるプログラムにて同時に実行した場合、
更新するキーは違うのでロックしないと思っていましたが何故かロックしました。

ロック状態の確認は、以下の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 :実行中のコマンド
2 INSERT、3 SELECT、6 UPDATE、7 DELETE

項目 LMODE :セッションがロックを保持している状態
0 なし、1 NULL、2 行共有、3 行ロック
4 共有、5 共有/行ロック、6 表ロック
*/

ロックしたテーブルSQLを調査してみると、プロセスAにてテーブルAにINNSERTすると、
プロセスBではテーブルAにINSERTすることが出来ませんでした。
Oracleは基本的に行ロックであり、キーの違うINSERTならロックされないはずです。
これが同一キーの場合は、2回目のINSERTがロックされるのは正しい動作ですが
キーが違うはずなのにロックされてしまいます。

原因は、行ロックではなくテーブルロックしている為だったのですが、
テーブルロックになる理由がわかりませんでした。

そこで、テーブルロックとなる原因を調査すると2パターンありました。

1、親子関係のあるテーブルで親を更新しそれに関連する子テーブル。
2、ダイレクト・パス・インサートの設定をしてある場合。

今回の場合は、ダイレクト・パス・インサートの設定が原因でした。
後から参加したシステムなので何故ダイレクト・パス・インサートの設定がしてあるか
わからないし、データベースの設定なので一人で解決できないので他の人に投げて完了です。

トラックバック(0)

トラックバックURL: http://wakux2.com/mt/mt-tb.cgi/1132

コメントする

アーカイブ

このブログ記事について

このページは、wakuwakuが2008年2月26日 23:08に書いたブログ記事です。

ひとつ前のブログ記事は「いまを生きる」です。

次のブログ記事は「時計じかけのオレンジ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


since 2005/03/10