2 Replies Latest reply: Nov 19, 2012 10:19 PM by ydysk RSS

    表ロックが発生する可能性とその原因について

    user9245968
      以下のようなことが起こりえるのか、教えていただきたく投稿させていただきました。

      1.とあるテーブルを更新する処理(更新件数はそれなりに多く、重い/処理1)を実行したところ、同じテーブルを更新する他の処理(処理2)まで止まってしまうという事象が発生
      2.ロック情報を確認したところ、そのテーブルに対して「表ロック」となっていた。
      3.該当の処理が走るシステムの中で表ロックをかけるようなことはしていない。(LOCK TABLEは実行していない)
      4.処理1と処理2で更新する行は競合していない。

      気になったのは2です。
      明示しなくてもSQLServerのように処理件数によって表ロックに自動的に移行したりすることはあり得るのでしょうか?
      Oracleは明示しない限り行ロックとなり、SQLServerのように処理件数で表ロックになったりはしないという認識でしたが
      この認識はただしいでしょうか?もしくは表ロックに自動的に移行するような条件が何かあったりするのでしょうか?

      なお、Oracleのバージョンは11.2、OSのバージョンはWindows2008ServerR2になります。

      ご存じの方がいらっしゃいましたら、ご教示いただきたくお願いいたします。
        • 1. Re: 表ロックが発生する可能性とその原因について
          asahide
          ORACLEはロックエスカレーションは発生しません。

          ロックを確認されたという事ですが、V$LOCK等で確認されていると思います。
          その場合にはどのセッションがロックを握っているか判りますので、そのセッションの情報を紐づければどの処理がロックしていたか判ると思います。


          ちなみにダイレクトインサート等は表ロックを獲得していると思います。
          • 2. Re: 表ロックが発生する可能性とその原因について
            ydysk
            他の方も言われているようにv$lockを正確に確認して、情報を把握しましょう。
            待機されているセッションのロックモード、リクエストモードが重要です。
            同一ブロックへの同時トランザクション数を制限するinitransの問題の可能性もあります。