以下SQL语句会导致死锁吗?

时间:2010-08-30 19:31:08

标签: sql-server deadlock

我正在寻找解释死锁问题的方法。我想我知道是什么导致了它,但我不确定确切的事件。

我们有一个长时间运行的视图(几秒钟)。我们正在更新该视图中使用的其中一个表。更新也可能需要几秒钟。抛出死锁错误时运行的更新语句将加入视图。例如:

UPDATE t1 SET
    Field1 = 'someValue'
FROM Table1 t1
JOIN TheView v ON v.TableId = t1.TableId
WHERE v.Condition = 'TheCondition'

由于死锁而似乎关闭的声明如下:

SELECT * FROM TheView

视图定义为:

CREATE VIEW TheView AS
    SELECT *
    FROM Table1 t1
    JOIN Table2 t2 ON t2.foo = t1.foo

我很确定发生了死锁,因为view和update语句都依赖于Table1。这种情况可能吗?

由于

3 个答案:

答案 0 :(得分:1)

您是否尝试过使用SQL Profiler? Profiler将准确地告诉您死锁中涉及哪些语句,并包含每个进程已锁定的资源,而其他进程需要这些资源等。

答案 1 :(得分:1)

有可能吗?当然。你需要做一些工作才能确定。请参阅:How to Track Down Deadlocks Using SQL Server 2005 Profiler

答案 2 :(得分:1)

绝对有可能。我在这里发布了几个类似的repro脚本:Reproducing deadlocks involving only one table

一种方法是使用快照隔离。