2011-04-30 16 views
2

我正在構建一個即時贏得比賽抽獎活動。基本上在一小時內隨機選擇的一分鐘內,下一個提交細節的用戶應該被選爲贏家。PHP/MySQL即時贏取程序 - 如何確保只有一個贏家被選中?

我遇到的問題是,如果MySQL正在運行多個連接,那麼我該如何阻止兩個或三個贏家被誤操作?我可以限制連接嗎,或者讓PHP等待所有當前的MySQL連接關閉?

回答

3
+0

這看起來很有趣!如果我鎖定一個表並且腳本由於某種原因而死亡,那麼表將保持鎖定狀態,還是mysql連接的結尾也會再次解鎖所有表? – koosa 2011-04-30 06:13:54

+0

謝謝,這是完美的。喜歡學習這樣的東西:) – koosa 2011-04-30 06:21:11

+0

如果客戶端會話連接終止,無論是正常還是異常,服務器都會隱式釋放會話持有的所有表鎖(事務性和非事務性)。你需要注意的是,當表被鎖定時,你不會運行一個很長的進程,因爲取決於鎖的類型,它會阻止對其他查詢的訪問 – bumperbox 2011-04-30 20:35:36

0

使用時,你的更新,你要更新的併發檢查您的WHERE子句中字段的初始值。這樣,只有第一個被執行的將會經過,因爲之後它將不再匹配WHERE子句。您可以通過使用mysql_affected_rows()函數來確定哪些用戶已經完成,哪些成功更新將返回1,其他用戶則返回0

+0

你好,我想我明白你的意思,但你能寫一點點SQL來給我看,只是爲了確定嗎? – koosa 2011-04-30 06:10:04

+0

我們真的想要推廣使用mysql_ *庫嗎? – 2011-04-30 06:22:27

0

在用戶詳細信息表中使用時間戳字段「registertime」。插入數據時,使用NOW()函數插入註冊表字段。

當您選擇一個隨機分鐘時,將其轉換爲unix時間。

獲獎者是:SELECT * FROM用戶表WHERE registertime> - 您的隨機分鐘的標記 - ORDER BY registertime LIMIT 1

+0

您好, 這是我正在做的事情,但我需要向用戶表明他們是他們提交表格時的贏家,所以如果我有2個併發連接,他們都會看到贏家的消息,這是我想避免的。 – koosa 2011-04-30 06:11:25

+0

也許你可以使用microtime()來獲得毫秒,而不是NOW()。 – AndrewR 2011-04-30 06:17:42

+0

如果您有一個查詢在目標時間之後僅返回第一個條目,則我認爲併發會話不成問題。 – AndrewR 2011-04-30 06:18:22

0

保持一個小的狀態表的地方,記錄了先前的平局小時。如果新記錄的插入時間在不同的小時,請檢查他們是否是贏家。

如果他們是,你用這個新的「贏家」繪製小時更新狀態表,這將阻止任何更多的小時抽獎。但是,如果偶然的話,沒有人在任何特定時間內真正「贏得」平局會發生什麼?你保證贏得註冊的最後一個人,或者根本沒有贏家?