2011-12-21 142 views
1

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

+2

,你能否告诉我们,插入和触发SQL不要使用触发器 – 2011-12-21 12:55:21

+0

? – AlG 2011-12-21 12:55:47

回答

2

要么对这个过程不使用多个线程 - 我认为这不是一个合理的选择 - 或者不使用触发器,而是使用后处理存储过程一次更新所有记录。

0

在所有更新发生之后,是否可以删除触发器并使用代码运行等效操作? 或者一个定期的程序运行来做触发器的等价物?

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

+0

NOLOCK does not help ...语句看起来像UPDATE field ='some text'+ otherfield WHERE ID IN(SELECT ID FROM INSERTED) – Sebastian 2011-12-21 12:59:05

+0

您是否尝试将锁定提示放在select以及更新上? '更新表与NOLOCK设置字段='一些文本'+ otherfield WHERE ID IN(SELECT ID FROM INSERTED WITH NOLOCK)'或类似的东西? – 2011-12-21 13:01:14

+0

我试试看 – Sebastian 2011-12-21 13:08:16

1

我建议您捕获死锁事件图表,以便确定哪些数据库对象/资源正在竞争(并最终导致死锁)。

参见:Detecting and Ending Deadlocks

你也应该看看执行计划/ s的您参与了这一过程的查询。您可能会发现特定的列是争用的来源(通常通过表/索引扫描),可以通过部署合适的索引(为了鼓励索引查找操作)来解决这个问题。

0

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

0

从长远来看,最简单的方法是完全避免高并发性。您是否可以批量插入行,通过登台表或表值参数?你能从一个连接做到吗?这可能会更快,并且无死锁。

尽管我们的系统有很多OLTP修改,但至少从4月起我们完全无死锁。

Also I wrote a canned answer with more approaches.