2011-12-21 128 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.