[英]SELECT and UPDATE statements one after other
我正在使用在線預訂系統。 在正常過程中,當用戶選擇在特定時間標記為“可用”的房間並提交其選擇時。 現在在后端,只是為了確認一下,我運行SELECT語句來驗證房間的狀態是否可用,如下所示:
SELECT room_status FROM rooms WHERE room_number = 'XXX'
然后我運行一個UPDATE查詢以將其標記為“不可用”:
UPDATE rooms SET room_status = 'UNAVAILABLE' WHERE room_number = 'XXX' AND room_status = 'AVAILABLE'
現在,當我運行SELECT查詢時,該空間可用,並且當我繼續進行UPDATE查詢時,該空間被其他用戶占用。 因此,UPDATE查詢將失敗。 我希望該房間僅供第一位用戶使用。 我該怎么辦 ?
更新:在某些情況下,用戶必須預訂多個房間。 例如,用戶選擇8個房間。 我的代碼在第4個房間檢查其狀態,當到達第8個房間時,第一個房間不見了。 當我檢查第4個房間時,直到現在第8個房間都消失了,這也可能發生。
我正在使用:PHP和MySQL
選擇行時,您需要鎖定它們,以便其他查詢在完成更新之前無法從中讀取或寫入。 在MySQL中,這可以使用SELECT ... FOR UPDATE語句在事務內部完成:
START TRANSACTION;
SELECT room_status FROM rooms WHERE room_number = 'XXX' FOR UPDATE;
從前一條語句返回的所有行將被鎖定,直到當前事務結束為止。 您現在可以將其標記為不可用:
UPDATE rooms SET room_status = 'UNAVAILABLE' WHERE room_number = 'XXX';
請記住通過提交更改來關閉事務。 這將釋放行上的鎖。
COMMIT;
我發現在Insert
, Update
和Delete
您需要在語句的末尾添加with NC
(無提交),否則它將不起作用。
有望解決該問題。
在這種情況下,請首先提交UPDATE
:
UPDATE rooms
SET room_status = 'UNAVAILABLE'
WHERE room_number = 'XXX' AND room_status = 'AVAILABLE'
然后檢查受影響的行數。 如果受影響的行數為1,則說明您已成功預訂會議室。
如果其他人提交了完全相同的查詢,則只有一個成功。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.