我有一张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?