2017-01-30 112 views
0

我有一個用戶表,其中每個用戶生成一個交易參考號並每次更新1以獲取下一個要使用的交易參考號。如何避免經常更新的表上的死鎖

表與此類似:

用戶名VARCHAR(50), 計數器INT

例如用戶名:約翰有一個計數器數1 如果他拿起一個參考號碼他的櫃檯號碼是更新爲2 ,以便他下次使用2作爲參考編號。

的問題是,因爲很多用戶使用這個表。結果我得到了很多dealocks。任何人都可以請指教。 Thx

+0

看一看:https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks.html –

回答

0

建議爲COUNTER列創建一個包含AUTO_INCREMENT的新表,並插入任何想要獲得新COUNTER的人。該AUTO_INCREMENT負責分配新遞增的編號,以新行的,你可以得到一個正常select查詢分配給任何特定的人的最新數字。

+0

THX斯里裏,但我喜歡在桌子200個用戶,每個用戶創建每天至少有300個參考號碼。按照你的建議,將會創建大尺寸數據的表格,因爲這意味着每天我會在這個新表格中插入60000行。 – user3540098

0

簡短的回答:你不能防止死鎖。

爲什麼?只是因爲你的系統設計工作。我還要舉:

我有每個用戶生成交易 參考號和更新1每次獲得下一交易 參考號碼用戶的表使用

讓我們假設你只有2個用戶。每個用戶同時發出一個查詢。現在,發生的情況是每個用戶都使用數據快照進行操作。因此,他們都會計算,例如,下一個交易號碼是2

因此,處理連接的兩個線程將爭奪一個鎖並最終陷入死鎖。爲了解決這個問題,MySQL殺死了一個線程,讓其他線程完成。他們爲什麼要爭奪鎖定?他們正在尋找了同一個表/計數器/不管它是什麼,爲了得到正確的信息,該信息不能隨意由任何人或任何修改。你很可能不希望每個人都得到相同的事務編號(實際上是線程),所以MySQL在執行計數遞增時在表上放置一個鎖。

問題的根源在於您試圖獲取事務的下一個數字,而多個人(實際上是線程)最終會查找相同的來源以獲取該數字。

你沒有太多的選擇在這裏,在這裏,他們是:

  • 通過重新發行交易處理死鎖,一旦MySQL的告訴你有一直陷入僵局。這是如何完成的。死鎖不是你應該擔心的,它只是數據庫告訴你的一種方式,爲了保持數據的完整性,它拒絕一個線程來完成它的工作。

  • 重新設計你的系統讓你不靠什麼下一交易數量會。這部分可能更難,我們不知道依賴於這個功能,但是 - 這將是您最好的選擇。我不知道是否有可能,所以我建議你考慮如果你不依賴下一個交易編號,你將如何讓你的系統工作。