我在存储过程中使用函数,过程包含事务并更新表并在同一个表中插入值,而过程中调用的函数也从同一个表中获取数据。
我知道程序已挂起并具有功能。
有同样的解决方案吗?
最佳答案
如果我没听错,你说的是一个插入本身阻塞,而不是两个单独的查询相互阻塞。
我们遇到了类似的问题,SSIS 包试图将一堆数据插入表中,但试图确保这些行尚不存在。现有的代码类似于(大大简化):
INSERT INTO bigtable
SELECT customerid, productid, ...
FROM rawtable
WHERE NOT EXISTS (SELECT CustomerID, ProductID From bigtable)
AND ... (other conditions)
这最终导致自身阻塞,因为 WHERE NOT EXISTS 上的选择阻止了 INSERT 的发生。
我们考虑了几种不同的选择,我会让您决定哪种方法适合您:
- 更改事务隔离级别(请参阅 this MSDN article)。我们的 SSIS 包默认为 SERIALIZABLE,这是最严格的。 (请注意,在选择此选项之前请注意 READ UNCOMMITTED 或 NOLOCK 的问题)
- 使用 IGNORE_DUP_KEY = ON 创建 UNIQUE 索引。这意味着我们可以插入所有行(并完全删除“WHERE NOT IN”子句)。重复项将被拒绝,但批处理不会完全失败,并且所有其他有效行仍将插入。
- 更改查询逻辑,例如将所有候选行放入临时表中,然后删除目标中已有的所有行,然后插入其余行。
在我们的例子中,临时表中已经有数据,因此我们只需删除不想插入的行,并对其余行进行简单的插入。
关于sql - 如何从 SQL Server 2005 中的表中删除锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2093970/