我正在寻找解释死锁问题的方法。我想我知道是什么导致了它,但我不确定确切的事件。
我们有一个长时间运行的视图(几秒钟)。我们正在更新该视图中使用的其中一个表。更新也可能需要几秒钟。抛出死锁错误时运行的更新语句将加入视图。例如:
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。这种情况可能吗?
由于
答案 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
一种方法是使用快照隔离。