2017-06-19 54 views
0

我有一個包含事件的所有票證的票據表。與「可用」的狀態,所有的票都預先創建的過程中保留,我想選擇和更新表中的N條記錄,這樣其他操作都可以在本次交易進入:結合選擇更新和限制操作,

-- get any 2 tickets that are available: 
SELECT * 
from tickets 
WHERE status = 'available' 
LIMIT 2 FOR UPDATE; 


--(...psuedo code: if 2 records were returned, set status to 'reserved' and update other tables , 
--otherwise rollback as all tickets could not be fulfilled) 

使用進行更新,這是否保證其他交易不會選擇相同的2行?我基本上想確保人們不能預訂相同的票。所以我想鎖定的行,所以它不能被其他事務

+0

鎖定行不會阻止閱讀** **行其他查詢。這將阻止他們更新行。而不是鎖定行,您可以改變狀態,以便不會像查詢中那樣使用where子句讀取它們。例如,進行更新並將狀態設置爲「掛起」,或者更好的方法是將其設置爲GUID,以便您可以稍後在過程中選擇/更新特定行。 –

+0

這很有道理!所以像這樣: 更新門票設置status ='pending',my_unique_id ='ABCD'where status ='available'limit 2; 我可以通過my_unique_id選擇稍後的權利?然後,如果我無法成功更新由限制定義的所有記錄,則可以回滾。我會試試這個,謝謝! –

回答