我有一張promo_codes
的表格,可以通過網絡應用程序來激活。有一個state
列,可以是0表示未激活或1表示激活。如果我運行SELECT ... FOR UPDATE適合一次性使用的行場景嗎?
SELECT FROM promo_codes WHERE state=0 LIMIT 1 FOR UPDATE;
UPDATE promo_codes SET state=1 WHERE id = ?;
發生第二個事務運行的事務:
SELECT FROM promo_codes WHERE state=0 LIMIT 1 FOR UPDATE;
是否只是返回下一行,或者它阻止,直到第一個事務完成?
我已經開始考慮基於redis中的行ID來設置鎖,因爲它對我來說很明顯如何工作,我知道它不會在MySQL中創建任何性能問題,但另一方面,必須有一種乾淨而高效的方式來純粹用SQL來完成這項工作。也許我可以先使用UPDATE ... LIMIT 1
,但是如何在這種情況下獲得促銷代碼的ID?