2009-10-07 105 views
0

可以說你有一張桌子上有一些中獎號碼。任何這些數字都只是被一個人「贏」了。如何防止處理相同記錄的多個Web請求?

我怎麼能防止來自兩個檢查提交相同的數字,看到這些數字仍然是可用的,然後給獎金他們兩個標記在號碼前爲不再可用2個併發Web請求。

this question獲獎的解決方案感覺就像我在想什麼做的,因爲它也可以在大多數數據庫平臺上應用。

是否有可以應用到任何相關的常見模式?

回答

6

這些數字是隨機生成的東西?

我會依靠數據庫本身的事務語義:有兩列,數量和要求創建一個表,並使用一個單一的更新:

UPDATE winners SET claimed=1 WHERE claimed=0 AND [email protected]; 

然後檢查受影響的行數。

+0

你需要一個交易Ironfroggy說。否則,您可以讓另一個請求獲取select和update之間的數字。 – 2009-10-07 19:24:49

+1

沒有選擇和更新 - 只是一個UPDATE,這是一個隱式事務。 – 2009-10-07 19:32:53

+1

只是好奇,如果你知道答案:如果使用SE沒有事務支持(例如MyIsam),這仍然是原子? – troelskn 2009-10-07 21:29:05

1

使用交易。您不應該有多個線程或進程在沒有事務鎖的情況下更改相同的數據,並且任何體面的數據庫都支持今天的事務。開始交易,「搶」中獎號碼,然後提交。另一個線程將被鎖定,直到提交,並且只有在記錄更新後才能得到它的機會,當它可以看到它已經存在時。

0

非數據庫解決方案可以是具有客戶機發出請求異步,然後按上的FIFO隊列的請求進行控制,使得僅一次一個要求越來越評估的請求。然後在評估完成後回覆給客戶。這樣做的好處是,在高負載下,用戶界面不會被凍結在數據庫級別事務鎖定的地方。