我在一个表中插入了许多并发线程,在这个表中是一个AFTER INSERT触发器,它更新插入行上的一个字段。 当这个在一个线程中执行时,一切都很好,但是有很多的我有一个死锁。 有什么我可以做的吗?SQL Server插入多个线程死锁
回答
要么对这个过程不使用多个线程 - 我认为这不是一个合理的选择 - 或者不使用触发器,而是使用后处理存储过程一次更新所有记录。
在所有更新发生之后,是否可以删除触发器并使用代码运行等效操作? 或者一个定期的程序运行来做触发器的等价物?
除此之外,我想查找锁定提示可能是一个好主意?也许你的触发器可以使用nolock提示?
NOLOCK does not help ...语句看起来像UPDATE field ='some text'+ otherfield WHERE ID IN(SELECT ID FROM INSERTED) – Sebastian 2011-12-21 12:59:05
您是否尝试将锁定提示放在select以及更新上? '更新表与NOLOCK设置字段='一些文本'+ otherfield WHERE ID IN(SELECT ID FROM INSERTED WITH NOLOCK)'或类似的东西? – 2011-12-21 13:01:14
我试试看 – Sebastian 2011-12-21 13:08:16
我建议您捕获死锁事件图表,以便确定哪些数据库对象/资源正在竞争(并最终导致死锁)。
参见:Detecting and Ending Deadlocks
你也应该看看执行计划/ s的您参与了这一过程的查询。您可能会发现特定的列是争用的来源(通常通过表/索引扫描),可以通过部署合适的索引(为了鼓励索引查找操作)来解决这个问题。
如果您将该值更新为插入的一部分,而不是插入后触发器,该怎么办?你可能也想看看整个数据库的使用情况。可能有办法通过更改某些查询来减少死锁的可能性。
从长远来看,最简单的方法是完全避免高并发性。您是否可以批量插入行,通过登台表或表值参数?你能从一个连接做到吗?这可能会更快,并且无死锁。
尽管我们的系统有很多OLTP修改,但至少从4月起我们完全无死锁。
- 1. 在存储过程中执行多个插入时Sql Server死锁错误
- 2. SQL Server死锁(SQL Server 2000)
- 3. Sql server数据库事务死锁; visual studio插入程序
- 4. SQL Server 2000死锁
- 5. 死锁在SQL Server
- 6. 多线程中的死锁
- 7. SQL Server 2008死锁问题
- 8. SQL server 2005死锁情况
- 9. SQL Server 2000 - 调试死锁
- 10. UPDATE上的SQL Server死锁
- 11. SQL Server 2000截断死锁
- 12. SQL Server 2005:事务死锁
- 13. 在表中插入行时发生SQL Server死锁
- 14. LINQ to SQL - 插入时出现死锁
- 15. Delphi线程死锁
- 16. Java线程死锁
- 17. Ruby线程死锁
- 18. Java,线程死锁?
- 19. C#线程死锁
- 20. 大容量插入死锁
- 21. 从多台机器插入到sql server表中时出现死锁
- 22. FFMPEG:多线程解码死锁?
- 23. 寻找多线程死锁的原因?
- 24. 加入完成std ::线程的死锁
- 25. 两个线程程序防止死锁
- 26. 插入Mysql的死锁
- 27. 死锁的线程java
- 28. 线程池死锁与Task.Result
- 29. 线程死锁异步
- 30. MemoryStream.CopyTo()导致线程死锁
,你能否告诉我们,插入和触发SQL不要使用触发器 – 2011-12-21 12:55:21
? – AlG 2011-12-21 12:55:47