2012-11-25 21 views
0

這是我的設置: 包含30分鐘時間段(整個半小時)的MySQL數據庫中的表格 顯示一段時間表的網站數量客房可在每個時段預訂。 最少預訂一小時所以每個預訂保留兩個插槽至少當預留的插槽他們變得不可用之前(不能預訂30分鐘一個房間)關於PHP/MySQL事務的澄清以及SELECT FOR UPDATE

我的問題是這樣的: 我使用PDO交易在PHP腳本通過更改其狀態(兩列枚舉類型)爲預訂預留多個插槽。因此,如果讓我們說兩個或兩個以上的客戶嘗試在同一時間段或者之前預訂一個房間,那麼如果我使用SELECT FOR UPDATE會發生什麼情況?第一個是否繼續該過程,其他人是否被拒絕(通過錯誤或空集)還是其他人在第一個完成後等待,並在其預訂或回滾的情況下提交數據庫中的更改他改變了主意,然後第二快的客戶試圖選擇行並更新它們,取決於第一行的行爲?

基本上我想知道是否必須實施某種重試系統。

此外,我很好奇,什麼時候該臨時鎖刪除;只有在事務提交時(包括mysql,auto-commit off)或影響select語句中某些/所有行的下一次更新時才提交事務?

回答

-1

基本上,在PDO中,交易(開始於beginTransaction方法)只是通過將autocomit設置爲false來「模擬」。 因此,即使選擇更新的併發訪問的風險很小,也是存在的。

您可以用SQL語句$db->query('START TRANSACTION')然後db->query('COMMIT');開始您的交易或,當然,失敗db->query('ROLLBACK'); 通常的情況下,它會可以讓你避免你的問題。 如果您想確定,您可以在交易中使用$db->query('LOCK TABLE ...');

當您使用事務時,所有內容都會同時發送,以便您的表中不會有垃圾。因爲每個事務(默認情況下一個查詢是一個事務)都是一個接一個地執行的,理論上這可以保護您免受同時訪問。但問題是,你使用SELECT來更新,我認爲當事務不能保護你時,可能會出現邊緣情況,並且你會默默地刪除另一個好的數據。

鎖表對此非常有用,因爲不允許使用任何邊緣套件。問題是,如果你鎖定太多時間,會發送一個錯誤。

+0

你看了這個問題嗎?他問,當第二個用戶試圖運行腳本時,如果第一個用戶鎖定表,他們會發生什麼情況:他們是否收到錯誤,或者他們是否等待表被解鎖。 – Barmar

+0

是的,我的第一個想法是鎖定表格進行編輯,但它是一個大表格,我不想鎖定每個人的表格,只是針對相關的行,這就是爲什麼我認爲選擇更新。另外,如果我使用你的方法,我應該在提交之前使用解鎖。此外,爲什麼這有利於pdo的交易。我認爲你可以使用pdo事務,也可以鎖定,只有你在提交或回滾後使用解鎖,我認爲 –

+0

好吧,所以這只是我的答案,不夠準確(我讀過的課程的問題)... – artragis

0

感謝所有幫助,我發現這裏的任何未來的訪客類似here的東西,以及...