2016-03-21 31 views
-1

他のテーブルを使用してXYZテーブルを更新する膨大なバッチ処理があります。このXYZテーブルは、アプリケーションUIから入力された情報を格納するためにも使用されます。現在、このバッチ処理が実行されている間に、ユーザーがUIからデータを入力してXYZ表に移動し、ユーザー・トランザクションを中止します。デッドロック回避

ERROR:

Msg 50000, Level 13, State 52, Procedure trgInsertBuilding, Line 101 Transaction (Process ID 65) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction. Msg 3609, Level 16, State 1, Line 1 The transaction ended in the trigger. The batch has been aborted.

バッチの実行中にDBにユーザデータを取得する方法はありますか?

答えて

0

デッドロックが発生する理由と実際のSQLの理由を調べることなく、わかりにくいです。私はあなたのバッチプロセスが1つの長いトランザクションで発生すると仮定します。レコードの数がかなり大きい場合、ある時点(または最初からではない場合)で、XYZ表全体が排他的にロックされます。これは、他のトランザクションがXYZに書き込むことができないことを意味します。

これを解決するための簡単な解決策はありません。これを解決するには、設計全体を再考する必要があります。しかし、あなたが試みることができるのはSnapshot isolation level in SQL Serverです。このオプションを使用すると、SQLサーバーの並行性メカニズムが悲観的から楽観的に変わり、同じテーブルに同時に書き込むことができます(同じ行には書き込めません)。

しかし、これはデータベース全体に影響し、プロダクションで使用する前に完全に検討し、調査し、テストしなければならないことに注意してください。

関連する問題