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)
谢谢,卡努
不,这是因为您有一个死锁的资源。您需要做的是使用 SQL 跟踪(您可以使用 SQL Profiler)或跟踪标志捕获死锁信息。
这将提供信息(并通过跟踪,您可以获得死锁图)以显示发生冲突的两个会话导致死锁和要选择的受害者(这就是您看到您发布的错误的原因)。
发生死锁。如果它们非常罕见,那么这可能不是一个需要担心的问题。但是,如果它们一直在发生,那么您需要深入了解是什么查询导致了它们。您可能需要修改您的 DML,或者在适当的情况下更改您的事务隔离级别(允许脏读不是答案),或者甚至使用乐观的隔离级别,如快照隔离或读取提交的快照隔离。但是这里需要好好考虑一下,因为那些乐观的隔离级别会使用行版本控制,这会影响tempdb,所以如果您没有tempdb的最佳配置,您可能会降低性能。