2016-04-14 16 views
0

私はこの例外がありますmsg:デッドロックの被害を受けないようにするにはどうすればよいですか?

トランザクション(プロセスID 55)は、別のプロセスでロックリソースにデッドロックされ、デッドロックの対象として選択されています。

スタックトレースに関与した自分のコードの行のみがここで最後だった:

public static DataTable ExecuteSQLReturnDataTable(string sql, CommandType cmdType, params SqlParameter[] parameters) 
{ 
    using (DataSet ds = new DataSet()) 
    using (SqlConnection connStr = new SqlConnection(CPSConnStr)) 
    using (SqlCommand cmd = new SqlCommand(sql, connStr)) 
    { 
     cmd.CommandType = cmdType; 
     cmd.CommandTimeout = EXTENDED_TIMEOUT; 
     foreach (var item in parameters) 
     { 
      cmd.Parameters.Add(item); 
     } 

     try 
     { 
      cmd.Connection.Open(); 
      new SqlDataAdapter(cmd).Fill(ds); 

これは、私は、クエリのすべてのソートに使用する汎用的な方法です。私は最近それを変更していないし、これまでにこの例外を見たこともありません。

この例外が再びスローされないようにするにはどうすればよいですか?

答えて

2

デッドロックの例外をキャッチしてXを何度もやり直すことができます。

デッドロックを回避する魔法のソリューションはありません。 SQL Serverがデッドロックを検出すると、そのプロセスの1つを強制終了します。場合によっては、あなたのプロセスが継続するのに十分な運が良かったデッドロックがあったかもしれません。

SQLプロファイラを使用してデッドロックをキャプチャできます。実際にデッドロックの原因を突き止めるために、私はこれを過去にやらなければなりませんでした。それほど頻繁に追跡するのが難しくなります。私たちのテスト環境では、いくつかの異なるマシンからデータベースをハンマーしてデッドロックを引き起こすためのテストコードを作成しました。

私たちの場合、インデックスに変更を加えてデータベースのトリガを変更し、デッドロックをできるだけ減らしました。最後に、再試行を「ちょうどよい場合」として実装しなければなりませんでした。

1

ExecuteSQLReturnDataTableに渡されたSQLが表示されていれば、助けになるかもしれません。その間にMinimizing Deadlocksを読んでください。

もちろん、デッドロックに寄与しているものも見なければならないかもしれません。

関連する問題