2017-07-03 56 views
0

我有以下情況:
我有幾個用戶查看的項目列表,每個項目可以通過單擊每個項目右側的按鈕「獲取」由單個用戶獲取,我想知道是否檢查項目的狀態(項目表中的布爾型獲取:true/false)足以確保一個項目不能被多個用戶獲取?或者是否有任何實際的方法來做到這一點在PHP/MySQL? 親切地, 優素福。併發PHP/MYSQL

回答

1

我想知道是否檢查項目的狀態(獲取的項目表中的布爾值:true/false)是否足以確保項目不能被多個用戶獲取?

取決於您如何使用它。如果你的代碼確實沿此線的東西:

if (current status of item is "free") { 
    update status of item to "taken"; 
} 

那麼將無法​​正常工作,因爲沒有了「檢查」和「更新」,其中另一個進程可以穿過的,並採取項目之間的差距爲自己!但是,如果你有一列,以指示該用戶聲稱的項目,沿着這條SQL查詢的東西行會的工作:

UPDATE items SET claimed_by = :current_user 
    WHERE item_id = :id AND claimed_by IS NULL 

這個查詢將拒絕更新這已經聲稱一個項目,你可以檢查該項目的claimed_by以確保您在繼續之前得到它。

+0

問題是,我將不得不更新和做一些插入查詢,我可以檢索更新返回來檢查更新是否發生?並基於這個答案,我決定是否插入查詢或不。這100%會工作嗎?我的意思是如果兩個用戶在同一時間執行更新查詢? (可能嗎?^^') – hereForLearing

+0

您可以查看UPDATE查詢更新的行數,或者之後運行SELECT並檢查「claims_by」的新值。至於併發性:數據庫服務器將序列化查詢。不管這些查詢有多少同時運行,只有其中一個會更新「claims_by」的值,其餘部分不會執行任何操作。 – duskwuff

+0

好的,先生,謝謝,我接受了你的回答。 – hereForLearing

2

在純粹的PHP沒有,作爲一個PHP頁面不能動態更新自己。

但是使用AJAX是可以做到的。無論是實用的還是另一個故事,因爲它取決於你想檢查的項目數量。即使這樣,總會有一個延遲,這取決於服務器速度,用戶連接速度等。

最好的辦法是在用戶按下獲取後有一條消息說「正在檢查」使用AJAX進行檢查,並以先到先得的原則先到達那裏,但仍然會得到該項目。

所以你的下一步將是查找AJAX(Javascript)。

另一種方法是做一個完整的頁面重新加載來檢查項目是否仍然可用,並預先顯示一個免責聲明,這將發生。由於完整的頁面重新加載,這種方法僅需要比使用AJAX更長的時間。

+1

謝謝你的回答,我不希望項目從用戶屏幕上消失,我想要的只是如果兩個用戶在同一時間點擊獲取只有一個將獲得該項目。 – hereForLearing

+2

@saywow然後AJAX是要走的路。 –

+0

Ajax並不是我的問題的解決方案,因爲正如我在評論中解釋的那樣,我的問題不是隱藏不可用的項目,但是如果兩個用戶想要在同一時間獲取同一項目:雙擊同時獲取兩個檢查項是否可用,在這種情況下答案是肯定的,因此兩者都會獲得它(這會導致錯誤,因爲在我的數據庫中它是一對多的關係),那麼我該怎麼做避免錯誤 – hereForLearing