2011-11-15 19 views
3

アプリケーションでは、C#コードからトランザクション内の15個のテーブルにレコードを挿入します。 これは、各テーブルに対して1つのinsertステートメントを作成し、すべてを1つのクエリに追加し、 'ExecuteNonQuery'を使用してテーブルにレコードを挿入します。なぜなら、挿入がすべてのテーブルで行われ、矛盾したデータを必要としないために、トランザクションでそれを使用しているからです。テーブルにデータを挿入中にテーブルロックを回避する方法

この機能はサービスで作成され、複数のサービス(同じサービス、異なるインストール)が同時にこのタスク(テーブルにデータを挿入)を実行します。 これらのサービスは、テーブルにまったく異なる行を挿入しており、決して依存しません。

しかし、これらのサービスを実行すると、これらの挿入ステートメントにデッドロックが発生しています。

コードは次のようである:

  1. オープンDB接続
  2. テーブル
  3. 挿入データは、トランザクションのコミットトランザクションを開始します。

すべてのサービスは、同じ15のテーブルにある異なるデータセットでこれらの手順を実行します。

SQLプロファイラトレースは、挿入中にこれらのテーブルに排他ロックが存在することを示しています。

テーブルに挿入ステートメントを実行し、デッドロックで終了するだけで、テーブルレベルのロックが必要な理由をお聞かせください。それを防ぐための最善の方法は何か。

+0

これを参照してくださいhttp://www.sql-server-performance.com/2006/deadlocks/ – hungryMind

+0

トランザクションを使用していないときでもロックを取得していますか? –

+0

SQL Serverトランザクションまたは.net? .netの場合は、コードを表示してください – gbn

答えて

2

排他ロックでも、ロックテーブルからデッドロックを取得することはありません。テーブルがロックされている場合、新しい挿入物は既存の挿入物が完了するのを待つだけです(no waitヒントを使用していないと仮定します)。

デッドロックは、SQL文を続行できないようにリソースをロックすると発生します。無制限のサブ選択、または挿入文で十分ではないwhere節を探します。

私たちはあなたが何をしているかを見ることができるようにあなたのSQLを投稿してください。

+0

できます。トランザクションAがT1でXロックを取得し、トランザクションBがT2でXロックを取得すると、循環待ちが発生する可能性があります。 BはT1でXロックを要求し、T2でAロックを要求します。 –

+0

Martin、それは私が言っていることです。あるセッションでA、B、Cをロックした後、別のセッションでA、B、Cをロックしてもデッドロックは発生せず、待機します。 user1047169は1つのトランザクションを使用しているため、15個の挿入が常に同じ順序で呼び出されていると仮定すると、多くのソースから挿入が行われているときと同様に循環参照の問題はないはずです。 –

+0

複数のサービスが含まれているのと同じ順序で呼び出されると仮定する理由はありません。 OPは実際にデッドロックグラフをポストする必要があります。 –

関連する問題