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

Sql server 在表中插入数据时如何避免表锁定,sql-server,insert,deadlock,Sql Server,Insert,Deadlock,在我们的应用程序中,我们将从C#代码在事务中的15个表中插入记录。 为此,我们为每个表创建一个insert语句,并在一个查询中追加all,并使用“ExecuteOnQuery”在表中插入记录。因为我们希望insert发生在所有表中,并且不希望有任何不一致的数据,所以我们在事务中使用它 此功能写在服务中,并且多个服务(相同的服务、不同的安装)同时执行此任务(将数据插入表)。 这些服务在表中插入完全不同的行,并且不以任何方式依赖 但是,当我们运行这些服务时,这些insert语句就会出现死锁 代码如下

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

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

但是,当我们运行这些服务时,这些insert语句就会出现死锁

代码如下所示:

  • 开放数据库连接
  • 开始交易
  • 在表中插入数据
  • 提交事务
  • 所有服务都对同15个表中的不同数据集执行这些步骤

    SQL探查器跟踪表明在插入时这些表上存在独占锁


    您能建议一下为什么它应该有表级锁,而只是在表上触发insert语句并以死锁结束吗。防止死锁的最佳方法是什么。

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

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


    发布您的sql,以便我们可以看到您正在做什么。

    看到了吗?当您不使用事务时,您是否仍然获得锁定?sql Server事务还是.net?如果是.net,请向我们显示您可以执行的代码。如果事务A在T1上获得X锁,事务B在T2上获得X锁,循环等待仍然可能发生。B请求T1上的X锁,A请求T2上的X锁。马丁,这就是我想说的。在一个会话中锁定A、B、C,然后在另一个会话中锁定A、B、C不会导致死锁,只是等待。由于user1047169使用的是单个事务,并且假设15个insert始终以相同的顺序调用,因此他不应该像从多个源进行insert时那样出现循环引用问题。没有理由假设它们以相同的顺序调用,因为涉及多个服务。OP真的应该发布死锁图;他正在调用同一服务的多个实例。发布死锁图当然会有所帮助。另外,我刚刚遇到了一个死锁问题,通过添加更具体的where子句解决了这个问题。子选择查看的行太多,无法找到需要更新的行。添加更具体的where子句解决了我的死锁问题。我可能会把这段经历投射到我的答案中。