无法从链接服务器 X 的 OLE DB 提供程序“SQLNCLI”获取行集

kan*_*anu 3 sql-server-2008 sql-server deadlock linked-server

我在通过链接服务器从同一个表进行并发读取时收到此错误。超时设置没问题。发生此错误时,我也开始收到相同查询的以下错误:

“事务(进程 ID X)在锁定资源上与另一个进程发生死锁,并已被选为死锁受害者。重新运行事务..”

这是否意味着可以通过链接服务器执行的读取数量有限制?如果是这样,限制是多少?或者这可能是因为其他原因吗?

此外,使用的查询如下:

SELECT  T.Col1, T.Col2, T.Col3, PG.Col1, PG.Col2, PG.Col3
INTO #TMP_OUTPUT 
FROM  linkedserver1.db1.dbo.table1 T WITH (NOLOCK)
      INNER JOIN #temp2 PG 
      ON T.Col1 = PG.Col1
WHERE T.Col3 = somevalue
Run Code Online (Sandbox Code Playgroud)

谢谢,卡努

Tho*_*ger 6

不,这是因为您有一个死锁的资源。您需要做的是使用 SQL 跟踪(您可以使用 SQL Profiler)或跟踪标志捕获死锁信息

这将提供信息(并通过跟踪,您可以获得死锁图)以显示发生冲突的两个会话导致死锁和要选择的受害者(这就是您看到您发布的错误的原因)。

发生死锁。如果它们非常罕见,那么这可能不是一个需要担心的问题。但是,如果它们一直在发生,那么您需要深入了解是什么查询导致了它们。您可能需要修改您的 DML,或者在适当的情况下更改您的事务隔离级别(允许脏读不是答案),或者甚至使用乐观的隔离级别,如快照隔离或读取提交的快照隔离。但是这里需要好好考虑一下,因为那些乐观的隔离级别会使用行版本控制,这会影响tempdb,所以如果您没有tempdb的最佳配置,您可能会降低性能。