2017-09-22 15 views
0

異なるSQL Serverエージェントジョブで2つのプロシージャを実行しています。どちらも同じテーブルを更新します。今、デッドロックエラーが発生しています。SQL ServerのモードUロック

テーブルには、履歴テーブルを更新するためのトリガーもあります。

私はXMLのデッドロックのレポートをチェックすると、それは次の情報が表示されます

<owner-list> 
    <owner mode="U" /> 
</owner-list> 
<waiter-list> 
    <waiter mode="U" requestType="wait" /> 
</waiter-list> 

は問題が何であるかを把握しようとしています。問題は断続的です。

+0

'U'ロックがある**は更新ロック** - 見て、非常に驚​​くべきことではありませんどちらのジョブも問題のテーブルを更新しています。したがって、あるプロセスが他のプロセスが同時に更新しようとしている行を更新しているかのように見えます –

答えて

0

私たちは、ストアドプロシージャのコードを共有する必要があります。 XMLコードだけでは十分ではありません。

これで、トランザクションでコードをラッピングしていますか?そしてテーブルをロックしますか?このよう

:物事がうまくいかない場合にも、ロールバックを使用することができます

BEGIN TRANSACTION 

SELECT * 
FROM tblYourTable 
WITH (TABLOCK, HOLDLOCK) -- lock the table until the end of the transaction 

-- Continue other queries with the table (Updating, Inserting, etc.) 

COMMIT TRANSACTION -- release the lock (and transaction) after you are done with all of your processing. 

しかし、Uロックに関するご質問にお答えするために、ここでロックがSQL Serverでどのように働くかの良い要約です:Lock Types

関連する問題