簡體   English   中英

SELECT和UPDATE語句一個接一個

[英]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;        

我發現在InsertUpdateDelete您需要在語句的末尾添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM