2011-01-07 17 views
2

次のSQL例外が発生しました。 トランザクションがロックリソースで別のプロセスでデッドロックされ、デッドロックの対象として選択されました。トランザクションを再実行します。バッチの終了時に、コミット不能なトランザクションが検出されます。トランザクションはロールバックされます。 ストアドプロシージャにトランザクションがありません。私は.netからトランスクリプトを行い、私はいつもそれらを使用して呼び出します。 これまでに会ったことがありますか?トランザクションがデッドロックされました

答えて

3

トランザクションは、どこで開始されてもトランザクションです。 c#またはRDBMSのいずれであろうと。

usingは、効果的にBEGIN TRANSCATIONを発行します。

MSDN (for SQL Server 2000 but still valid)は、デッドロックが検出されたときに自動的に再試行することをお勧めします。ここでコードを書き込むのではなく、Googleで多くの検索結果が表示されます。

+0

IMO MSDNはこの点では間違っています。思考せずに自動的に再試行すれば、他人の変更を失う可能性が非常に高くなります。 –

+0

@AlexKuznetsov:デッドロックは、通常は同じ行ではなく、別のプロセスで同じテーブル/ページ/インデックスにあることがわかりました。行に最小限の書込みパスがある場合、同じコード/アクションを使用する2つの並行プロセスはデッドロックしません。しかし、INSERT親から子へ、親からDELETEへの子があればよいでしょう。私の場合は、とにかく他の変更を探しています。たとえば、編集のためにデータが画面上にどれだけ長く保存されているか分かりません。 – gbn

+0

"同じコードを使用する同時プロセス/アクションはデッドロックしないでください" - ここでは、ストアドプロシージャが同じprocフォームで別の接続を処理する方法を示すreproがあります:http://sqlblog.com/blogs /alexander_kuznetsov/archive/2008/11/27/defensive-database-programming-if-statement-vs-where-clause.aspx –

0

トランザクションを使用するときは、デフォルトでは分離レベルを逐次化可能に設定するため注意が必要です。接続がプールに戻されると、そのレベルセットがまだ残っています。これは並行性に重大な影響を与える可能性があります。

関連する問題