データベース レプリケーション エージェントと nolock ヒントを使用する select ステートメントの間でデッドロックが発生しました。select ステートメントが被害者として選ばれました。これが select ステートメントです。ご覧のとおり、FROM 句の両方のオブジェクトで nolock ヒントを使用しています。
SELECT col1, col2, etc.
FROM dbo.view1 AS vw WITH (nolock)
INNER JOIN dbo.table1 AS tbl WITH (nolock)
ON vw.column1 = tbl.column1
AND vw.column2 = tbl.column2
デッドロックに関する詳細は次のとおりです。
サーバー A からサーバー B に大量のデータを移動するために SSIS パッケージを呼び出す "サーバー B" に SQL エージェント ジョブがあります。サーバー A のデータ ソースはトランザクション レプリケーションでレプリケートされます。サーバー A は SQL Server 2008 R2 SP2 を実行しており、サーバー B は SQL Server 2008 SP3 を実行しています。
SSIS パッケージのデータ フロー タスクは最大 1 GB のデータを移動する必要があり、サーバー A とサーバー B は地理的に離れているため、クエリに時間がかかる場合があります。サーバー A のレプリケーション エージェントをブロックしたくないので、データ フロー タスクで nolock ヒントを使用しました。このデータでは、データの整合性は大きな問題ではありません。
SSIS パッケージは問題なく数回実行されましたが、最後に実行されたとき、サーバー A のレプリケーション エージェントと nolock ヒントを使用する SSIS パッケージの select ステートメントとの間にデッドロックが発生し、ジョブが失敗しました。サーバー A の SQL Server エラー ログからのエラー メッセージは次のとおりです。
Replication-Replication Snapshot Subsystem: agent <replication-agent-name> scheduled for retry. The replication agent had encountered an exception.
Source: Replication
Exception Type: Microsoft.SqlServer.Replication.SqlDeadlockException
Exception Message: Transaction (Process ID 72) was deadlocked on lock resources with another process and has be
サーバー B の SQL エージェント ジョブ履歴からのエラー メッセージ:
Transaction (Process ID 75) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.