我遇到了数据库复制代理和使用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
以下是有关死锁的更多详细信息:
我在“服务器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.