1. 程式人生 > 其它 >sqlServer死鎖問題:事務(程序 ID xx)與另一個程序被死鎖在鎖資源上,並且已被選作死鎖犧牲品,請重新執行該事務。

sqlServer死鎖問題:事務(程序 ID xx)與另一個程序被死鎖在鎖資源上,並且已被選作死鎖犧牲品,請重新執行該事務。

技術標籤:問題解決sqlserver

產生死鎖的業務場景

今天測試了一下消費者的儲存新增訂單模組,當時rabbitmq上有100+條訂單訊息,開啟消費者去消費的時候報了這個錯誤

(程序 ID 88)與另一個程序被死鎖在 鎖 資源上,並且已被選作死鎖犧牲品。請重新執行該事務。的錯誤

問題思考:

因為不同執行緒在事務中處理相同的資料時,在搶佔資料庫鎖的過程中都拿到了這個表的鎖,資料庫會採取讓一個執行而另一個放棄執行,會導致該錯誤的出現,即選作死鎖犧牲品

解決辦法

在insert語句後加WITH (TABLOCKX)

名詞介紹:

排它鎖又稱為寫鎖((eXclusive lock,簡記為X鎖)),若事務T對資料物件A加上X鎖,則只允許T讀取和修改A,其它任何事務都不能再對A加任何型別的鎖,直到T釋放A上的鎖。它防止任何其它事務獲取資源上的鎖,直到在事務的末尾將資源上的原始鎖釋放為止。排它鎖與共享鎖相對應,就是指對於多個不同的事務,對同一個資源只能有一把鎖。在更新操作(INSERT、UPDATE 或 DELETE)過程中始終應用排它鎖。

例項

insert into zefang.zf_order with(TABLOCKX) values ......