我有两个存储过程,其中一个被称为很多,因此非常简单并且执行良好。另外,即使它们是可序列化的,这些实际上在并行中也能很好地工作。
但是我有第二个查询只在某些情况下调用,在触摸相同的表之前需要进行更多的检查。问题是当你并行运行它们时,你会遇到死锁,因为每个存储过程都会以不同的顺序锁定。
我的问题是,您是否可以强制某个特定的sproc按特定顺序获取锁定以匹配您的重要查询?这样他们就不会陷入僵局并且执行得很好:)。
编辑: 作为澄清,我希望我的第二个程序是这样做的。
--Lock table1
--Lock table2
--Perform query.
答案 0 :(得分:2)
您可以为此提供Table Hints。
来自MSDN:
表提示通过指定锁定方法,一个或多个索引,查询处理操作(如表扫描或索引查找)或者数据操作语言(DML)语句的持续时间来覆盖查询优化程序的默认行为。其他选择。
非常小心,因为非常很容易搞砸......
例如:
SELECT Id FROM MyTable WITH UPDLOCK
将在MyTable上进行更新锁定,直到事务完成。
对于不同类型的锁,有各种提示。使用适当的东西。
答案 1 :(得分:1)
如果你的第二个proc在执行查询之前需要锁定2个表,我认为这不是导致问题的锁定顺序,它只是两个触发器之间的直接死锁。
您是否尝试过快照隔离?它可能不适合您的情况,但它可以缓解锁定问题。
也可以调查应用程序锁(在BOL中查找sp_getapplock / sp_releaseapplock)。
使用表格提示控制所采取的锁定,我认为不会解决您的问题。
恕我直言,99%的死锁可以用索引解决,而不是搞乱隔离级别,升级锁或应用程序锁 - 再次可能对你没有帮助,但是没有任何进一步的细节很难说。