我在数据库复制代理和使用 nolock 提示的 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
以下是有关死锁的更多详细信息:
我在“服务器 B”上有一个 SQL 代理作业,它调用 SSIS 包将大量数据从服务器 A 移动到服务器 B。服务器 A 上的数据源通过事务复制进行复制。服务器 A 运行 SQL Server 2008 R2 SP2,服务器 B 运行 SQL Server 2008 SP3。
SSIS 包中的数据流任务需要移动最多 1GB 的数据,并且服务器 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.