我正在構建一個即時贏得比賽抽獎活動。基本上在一小時內隨機選擇的一分鐘內,下一個提交細節的用戶應該被選爲贏家。PHP/MySQL即時贏取程序 - 如何確保只有一個贏家被選中?
我遇到的問題是,如果MySQL正在運行多個連接,那麼我該如何阻止兩個或三個贏家被誤操作?我可以限制連接嗎,或者讓PHP等待所有當前的MySQL連接關閉?
我正在構建一個即時贏得比賽抽獎活動。基本上在一小時內隨機選擇的一分鐘內,下一個提交細節的用戶應該被選爲贏家。PHP/MySQL即時贏取程序 - 如何確保只有一個贏家被選中?
我遇到的問題是,如果MySQL正在運行多個連接,那麼我該如何阻止兩個或三個贏家被誤操作?我可以限制連接嗎,或者讓PHP等待所有當前的MySQL連接關閉?
使用時,你的更新,你要更新的併發檢查您的WHERE子句中字段的初始值。這樣,只有第一個被執行的將會經過,因爲之後它將不再匹配WHERE子句。您可以通過使用mysql_affected_rows()
函數來確定哪些用戶已經完成,哪些成功更新將返回1
,其他用戶則返回0
。
你好,我想我明白你的意思,但你能寫一點點SQL來給我看,只是爲了確定嗎? – koosa 2011-04-30 06:10:04
我們真的想要推廣使用mysql_ *庫嗎? – 2011-04-30 06:22:27
在用戶詳細信息表中使用時間戳字段「registertime」。插入數據時,使用NOW()函數插入註冊表字段。
當您選擇一個隨機分鐘時,將其轉換爲unix時間。
獲獎者是:SELECT * FROM用戶表WHERE registertime> - 您的隨機分鐘的標記 - ORDER BY registertime LIMIT 1
保持一個小的狀態表的地方,記錄了先前的平局小時。如果新記錄的插入時間在不同的小時,請檢查他們是否是贏家。
如果他們是,你用這個新的「贏家」繪製小時更新狀態表,這將阻止任何更多的小時抽獎。但是,如果偶然的話,沒有人在任何特定時間內真正「贏得」平局會發生什麼?你保證贏得註冊的最後一個人,或者根本沒有贏家?
這看起來很有趣!如果我鎖定一個表並且腳本由於某種原因而死亡,那麼表將保持鎖定狀態,還是mysql連接的結尾也會再次解鎖所有表? – koosa 2011-04-30 06:13:54
謝謝,這是完美的。喜歡學習這樣的東西:) – koosa 2011-04-30 06:21:11
如果客戶端會話連接終止,無論是正常還是異常,服務器都會隱式釋放會話持有的所有表鎖(事務性和非事務性)。你需要注意的是,當表被鎖定時,你不會運行一個很長的進程,因爲取決於鎖的類型,它會阻止對其他查詢的訪問 – bumperbox 2011-04-30 20:35:36