我在一個表中插入了許多併發線程,在這個表中是一個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. 多線程死鎖
- 2. SQL Server死鎖
- 3. 在存儲過程中執行多個插入時Sql Server死鎖錯誤
- 4. SQL Server死鎖(SQL Server 2000)
- 5. Sql server數據庫事務死鎖; visual studio插入程序
- 6. 死鎖在SQL Server
- 7. SQL Server 2000死鎖
- 8. 多線程中的死鎖
- 9. 多線程和死鎖
- 10. UPDATE上的SQL Server死鎖
- 11. SQL Server 2008死鎖問題
- 12. SQL Server 2000截斷死鎖
- 13. WCF內的SQL Server死鎖
- 14. SQL Server 2000 - 調試死鎖
- 15. SQL Server 2005:事務死鎖
- 16. SQL server 2005死鎖情況
- 17. Rails + SQL SERVER 2008 +死鎖
- 18. SQL Server,插入一行鎖整個表
- 19. 在表中插入行時發生SQL Server死鎖
- 20. LINQ to SQL - 插入時出現死鎖
- 21. Ruby線程死鎖
- 22. C#線程死鎖
- 23. C++線程死鎖
- 24. Python線程死鎖
- 25. Delphi線程死鎖
- 26. Java,線程死鎖?
- 27. Java線程死鎖
- 28. 大容量插入死鎖
- 29. 從多臺機器插入到sql server表中時出現死鎖
- 30. Sybase批量插入死鎖
,你能否告訴我們,插入和觸發SQL不要使用觸發器 – 2011-12-21 12:55:21
? – AlG 2011-12-21 12:55:47