C# SQL Server在多个线程中插入死锁

C# SQL Server在多个线程中插入死锁,c#,.net,sql,sql-server,deadlock,C#,.net,Sql,Sql Server,Deadlock,我在一个具有多个并发线程的表中插入,该表中有一个后插入触发器,它更新插入行上的一个字段。 当这在一个线程中执行时,一切都很好,但在许多线程中,我遇到了死锁。 有什么我可以做的吗?或者不使用多个线程来执行此过程(我认为这不是一个合理的选择),或者不使用触发器,而是使用一个后处理存储过程来一次更新所有记录。是否可以删除触发器并通过代码运行等效的操作,在所有更新发生之后? 或者运行一个周期性过程来执行与触发器相同的操作 除此之外,我想查找锁定提示可能是个好主意?也许您的触发器可以使用nolock提示?

我在一个具有多个并发线程的表中插入,该表中有一个后插入触发器,它更新插入行上的一个字段。 当这在一个线程中执行时,一切都很好,但在许多线程中,我遇到了死锁。
有什么我可以做的吗?

或者不使用多个线程来执行此过程(我认为这不是一个合理的选择),或者不使用触发器,而是使用一个后处理存储过程来一次更新所有记录。

是否可以删除触发器并通过代码运行等效的操作,在所有更新发生之后? 或者运行一个周期性过程来执行与触发器相同的操作


除此之外,我想查找锁定提示可能是个好主意?也许您的触发器可以使用nolock提示?

我建议您捕获死锁事件图,以确定哪些数据库对象/资源受到竞争,并最终导致死锁

见:


您还应该查看执行计划,了解此流程中涉及的查询。您可能会发现,通过表/索引扫描,某个特定列是contentionoften的源,可以通过部署适当的索引来解决该问题,以鼓励索引查找操作

如果将值更新为插入的一部分,而不是插入后触发器,该怎么办。您可能还想查看数据库的总体使用情况。可能有一种方法可以通过更改某些查询来减少死锁的可能性。

从长远来看,最简单的方法是完全避免高并发性。可以通过临时表或表值参数批量插入行吗?你能从一个连接上完成吗?这可能会更快,不会出现僵局

虽然我们的系统有很多OLTP修改,但至少从4月份起我们就完全没有死锁了


你能给我们看一下插入和触发器的SQL吗?NOLOCK没有帮助。。。该语句看起来像UPDATE field='some text'+otherfield,其中ID在SELECT ID FROM insertedddid中。是否尝试在SELECT和UPDATE上添加锁定提示使用NOLOCK集合字段更新表格='some text'+其他字段,其中SELECT ID FROM中的ID插入NOLOCK'或类似的内容?