sql - 如何从 SQL Server 2005 中的表中删除锁定?

标签 sql sql-server sql-server-2005 t-sql

我在存储过程中使用函数,过程包含事务并更新表并在同一个表中插入值,而过程中调用的函数也从同一个表中获取数据。

我知道程序已挂起并具有功能。

有同样的解决方案吗?

最佳答案

如果我没听错,你说的是一个插入本身阻塞,而不是两个单独的查询相互阻塞。

我们遇到了类似的问题,SSIS 包试图将一堆数据插入表中,但试图确保这些行尚不存在。现有的代码类似于(大大简化):

INSERT INTO bigtable
SELECT customerid, productid, ...
    FROM rawtable
    WHERE NOT EXISTS (SELECT CustomerID, ProductID From bigtable)
    AND ... (other conditions)

这最终导致自身阻塞,因为 WHERE NOT EXISTS 上的选择阻止了 INSERT 的发生。

我们考虑了几种不同的选择,我会让您决定哪种方法适合您:

  1. 更改事务隔离级别(请参阅 this MSDN article)。我们的 SSIS 包默认为 SERIALIZABLE,这是最严格的。 (请注意,在选择此选项之前请注意 READ UNCOMMITTED 或 NOLOCK 的问题)
  2. 使用 IGNORE_DUP_KEY = ON 创建 UNIQUE 索引。这意味着我们可以插入所有行(并完全删除“WHERE NOT IN”子句)。重复项将被拒绝,但批处理不会完全失败,并且所有其他有效行仍将插入。
  3. 更改查询逻辑,例如将所有候选行放入临时表中,然后删除目标中已有的所有行,然后插入其余行。

在我们的例子中,临时表中已经有数据,因此我们只需删除不想插入的行,并对其余行进行简单的插入。

关于sql - 如何从 SQL Server 2005 中的表中删除锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2093970/

相关文章:

sql - 用于实验室值的 SAS 宏

sql - MS Access SQL, "function calls"

MySQL:如何使用计数函数和连接表列出所有内容?

sql - 无法使用域用户在 Linux 上使用 perl Sybase dbi 连接到 mssql 2008

sql - 使用日期列中的自动递增日期更新表

java - 使用 java 检查 ibatis 中的 isNotEqual 属性

java - 使用 jdbc 驱动程序将 java 连接到 SQL Server

sql-server - 为什么我们不能在 SQL Server 的函数内执行存储过程

sql - 添加内部查询不会改变执行计划

sql-server - 引用列的统计信息是否会阻止删除该列?