2012-03-24 88 views
3

我聽說過許多應用程序開發人員在數據庫處理競爭條件方面有點麻煩。一個典型的例子是這樣的:數據庫競爭條件

  • 用戶1選擇了在一個場,也就是說,numStock,其是3
  • 用戶2也選擇numStock,這仍然是3
  • 用戶1遞減numStock(應用程序),並將其設置爲2在數據庫中。
  • 用戶2還減少numStock(在應用程序中),並將其設置爲2在數據庫中。

在這個例子中,numStock字段應該已經變爲1,但是由於用戶之間的競爭而被設置爲2。

所以當然可以使用鎖,但我想過處理這種問題的另一種方式 - 將所有行的詳細信息作爲WHERE條件傳遞。讓我來解釋......

在上面的例子中,SQL代碼可能是這樣的:

//選擇

SELECT itemID, numStock FROM items WHERE itemID = 45 

//更新

UPDATE items SET numStock = 2 WHERE itemID = 45 

我的想法解決比賽:

//選擇

SELECT itemID, numStock FROM items WHERE itemID = 45 

//更新

UPDATE items SET numStock = 2 WHERE itemID = 45 AND numStock = 3 

因此,查詢檢查數據是否因爲它SELECT-ED的數據而改變。 所以我的問題是:(1)這[總是]工作?和(2)與數據庫鎖定機制(例如,MySQL事務)相比,這是更好的選擇嗎?

謝謝你的時間。

回答

5

該策略適用並稱爲「樂觀鎖定」。那是因爲你做了你的處理,假設它會成功,只有在最後纔會檢查它是否成功。

當然,您需要一種重試交易的方式。如果失敗的機率很高,可能會變得效率低下。但在大多數情況下,它工作得很好。

+1

只有單個數據庫連接時會發生數據庫爭用情況嗎? – arrowd 2015-03-02 06:39:02

+1

某些數據庫包含運行異步進程的選項,您甚至可以通過單個連接獲得競爭條件。當然,根據你的觀點,這些過程可能被視爲單獨的連接。 ... – 2015-03-02 06:42:40