在我们的应用程序中,我们在C#代码的事务中的15个表中插入记录。 为此,我们为每个表创建一个insert语句,并在一个查询中追加all并使用'ExecuteNonQuery'在表中插入记录。因为,我们希望在所有表中发生插入并且不希望任何不一致的数据,我们在事务中使用它。
此功能是在服务中编写的,并且不止一次服务(相同服务,不同安装)同时执行此任务(将数据插入表)。 这些服务在表中插入完全不同的行,而不是以任何方式依赖。
但是,当我们运行这些服务时,我们会在这些插入语句上遇到死锁。
代码是这样的:
所有服务都在相同的15个表中的不同数据集上执行这些步骤。
SQL事件探查器跟踪建议在插入时对这些表有独占锁。
你能不能建议为什么它只有在表上触发insert语句并以死锁结束时才有表级锁。什么是防止它的最佳方法。
答案 0 :(得分:2)
您不会仅通过锁定表获得死锁,甚至是独占锁定。如果表被锁定,新插入将只等待现有插入完成(假设您没有使用no wait
提示)。
当您以无法继续sql语句的方式锁定资源时会发生死锁。在insert语句中查找无限的子选择或where子句不够具体。
发布你的sql,这样我们就能看到你在做什么。