如何在表中插入数据时避免表锁定

时间:2011-11-15 11:21:09

标签: sql-server insert deadlock

在我们的应用程序中,我们在C#代码的事务中的15个表中插入记录。 为此,我们为每个表创建一个insert语句,并在一个查询中追加all并使用'ExecuteNonQuery'在表中插入记录。因为,我们希望在所有表中发生插入并且不希望任何不一致的数据,我们在事务中使用它。

此功能是在服务中编写的,并且不止一次服务(相同服务,不同安装)同时执行此任务(将数据插入表)。 这些服务在表中插入完全不同的行,而不是以任何方式依赖。

但是,当我们运行这些服务时,我们会在这些插入语句上遇到死锁。

代码是这样的:

  1. 打开数据库连接
  2. 开始交易
  3. 在表格中插入数据
  4. 提交交易。
  5. 所有服务都在相同的15个表中的不同数据集上执行这些步骤。

    SQL事件探查器跟踪建议在插入时对这些表有独占锁。

    你能不能建议为什么它只有在表上触发insert语句并以死锁结束时才有表级锁。什么是防止它的最佳方法。

1 个答案:

答案 0 :(得分:2)

您不会仅通过锁定表获得死锁,甚至是独占锁定。如果表被锁定,新插入将只等待现有插入完成(假设您没有使用no wait提示)。

当您以无法继续sql语句的方式锁定资源时会发生死锁。在insert语句中查找无限的子选择或where子句不够具体。

发布你的sql,这样我们就能看到你在做什么。