您是否可以强制SQL存储过程以给定顺序获取锁定

时间:2009-09-09 04:12:03

标签: sql sql-server tsql stored-procedures deadlock

我有两个存储过程,其中一个被称为很多,因此非常简单并且执行良好。另外,即使它们是可序列化的,这些实际上在并行中也能很好地工作。

但是我有第二个查询只在某些情况下调用,在触摸相同的表之前需要进行更多的检查。问题是当你并行运行它们时,你会遇到死锁,因为每个存储过程都会以不同的顺序锁定。

我的问题是,您是否可以强制某个特定的sproc按特定顺序获取锁定以匹配您的重要查询?这样他们就不会陷入僵局并且执行得很好:)。

编辑: 作为澄清,我希望我的第二个程序是这样做的。

--Lock table1
--Lock table2

--Perform query.

2 个答案:

答案 0 :(得分:2)

您可以为此提供Table Hints

来自MSDN:

  

表提示通过指定锁定方法,一个或多个索引,查询处理操作(如表扫描或索引查找)或者数据操作语言(DML)语句的持续时间来覆盖查询优化程序的默认行为。其他选择。

非常小心,因为非常很容易搞砸......

例如:

SELECT Id FROM MyTable WITH UPDLOCK

将在MyTable上进行更新锁定,直到事务完成。

对于不同类型的锁,有各种提示。使用适当的东西。

答案 1 :(得分:1)

如果你的第二个proc在执行查询之前需要锁定2个表,我认为这不是导致问题的锁定顺序,它只是两个触发器之间的直接死锁。

您是否尝试过快照隔离?它可能不适合您的情况,但它可以缓解锁定问题。

也可以调查应用程序锁(在BOL中查找sp_getapplock / sp_releaseapplock)。

使用表格提示控制所采取的锁定,我认为不会解决您的问题。

恕我直言,99%的死锁可以用索引解决,而不是搞乱隔离级别,升级锁或应用程序锁 - 再次可能对你没有帮助,但是没有任何进一步的细节很难说。