复制的SQL Server数据库死锁查询受害者

时间:2014-03-19 14:16:41

标签: sql-server sql-server-2008-r2 replication deadlock

我复制了一个SQL Sever 2008 R2数据库设置和一个每小时运行一次的查询(运行大约需要3分钟)。此查询使用其结果填充临时表。

然而,我经常遇到这个错误:

  

事务(进程ID 63)在锁资源上与另一个进程发生死锁,并被选为死锁牺牲品。重新运行该交易。 [SQLSTATE 40001](错误1205)

这会停止查询运行。

处理此错误的最佳做法是什么。

提前致谢。

  

exec sp_executesql N' EXECUTE msdb.dbo.sp_sqlagent_log_jobhistory @job_id = @ P1,@ step_id = @ P2,@ ssql_message_id = @ P3,@ ssql_severity = @ P4,@ run_status = @ P5,@ run_date = @ P6 ,@ run_time = @ P7,@ run_duration = @ P8,@ operator_id_emailed = @ P9,@ operator_id_netsent = @ P10,@ operator_id_paged = @ P11,@ retries_attempted = @ P12,@ session_id = @ P13,@ message = @ P14&#39 ;,N' @ P1 uniqueidentifier,@ P2 int,@ P3 int,@ P4 int,@ P5 int,@ P6 int,@ P7 int,@ P8 int,@ P9 int,@ P10 int,@ P11 int, @ P12 int,@ P13 int,@ P14 nvarchar(4000)' 0A7AFD76-D2EC-463E-A802-8B66241B0D26',2,8153,13,0,20140320,110114,219, 0,0,0,0,52,N'以用户身份执行:DOMAIN \ sql。事务(进程ID 62)在锁资源上与另一个进程发生死锁,并被选为死锁牺牲品。重新运行该交易。 [SQLSTATE 40001](错误1205)警告:聚合或其他SET操作消除了空值。 [SQLSTATE 01003](错误8153)。步骤失败。'

以上是返回表格Profiler。

1 个答案:

答案 0 :(得分:2)

您需要调查导致死锁的原因。解决方案完全取决于您找到的内容。一些关于这个主题的读物:

请注意,如果您在更新时扫描表,则死锁可能非常。 A 3分钟'查询由复制代理主动修改的数据可能就是这种情况。理想情况下,您的查询应该被优化以仅读取相关数据(例如,自上次读取以来发生了什么变化)。一个便宜的出路是在数据库中启用版本控制,阅读Implementing Snapshot or Read Committed Snapshot Isolation in SQL Server: A Guide

ALTER DATABASE <dbname> SET READ_COMMITTED_SNAPSHOT ON;