我正在創建一個在線排隊網站。首先,用戶登錄Web應用程序。在他第一次登錄時,他被分配了一個隊列號(在現場事件期間將用於確定用戶的訂單)。競賽狀況會發生嗎?預期用戶介於600-1000
之間。PHP/PostGresql中可能出現競態條件(這是針對在線排隊網站)?
當用戶的隊列號被確定時,我不希望有任何衝突。我計劃通過在數據庫中跟蹤給定的最後一個隊列號來分配一個隊列號,然後將其增加1並將該號碼分配給用戶的「Queue_NO」。
其中用戶是數據庫中的實體。
我正在創建一個在線排隊網站。首先,用戶登錄Web應用程序。在他第一次登錄時,他被分配了一個隊列號(在現場事件期間將用於確定用戶的訂單)。競賽狀況會發生嗎?預期用戶介於600-1000
之間。PHP/PostGresql中可能出現競態條件(這是針對在線排隊網站)?
當用戶的隊列號被確定時,我不希望有任何衝突。我計劃通過在數據庫中跟蹤給定的最後一個隊列號來分配一個隊列號,然後將其增加1並將該號碼分配給用戶的「Queue_NO」。
其中用戶是數據庫中的實體。
確實可能發生衝突,但這沒關係。
使用事務數據庫時,數據修改查詢可能因衝突而失敗。數據庫將檢測到衝突並報告。 (對於帶有「could not serialize access due to concurrent update
」錯誤消息的example)。檢查交易狀態並在發生衝突時重複交易是一種常見做法。
同樣,當您向數據庫中插入新的隊列號時,您必須檢查事務是否成功,如果不是,請重複。
您可以按照Ali的建議創建autoincrement,但我通常更喜歡更簡單的「max + 1」邏輯。
但是,請注意,autoincrement和「max + 1」的行爲有所不同:如果您在隊列末尾刪除了多個條目(或者某些插入事務回滾),則「max + 1」方法將重複使用他們的號碼autoincrement將使這些號碼不被使用。
P.S.一個例子:http://sqlfiddle.com/#!15/06b87/7
CREATE TABLE queue (id INTEGER NOT NULL PRIMARY KEY);
INSERT INTO queue SELECT COALESCE (MAX (id) + 1, 1) FROM queue RETURNING id;
我想最好的辦法是製作一個名爲event_queue的表格,並用自動增量生成數字。
id
id_event
id_user
可以是字段。當新用戶登錄某個事件時,請爲事件隊列創建一個新條目,該ID將爲她的隊列號