Mysql 是选择。。。适用于一次性使用行场景的更新?

Mysql 是选择。。。适用于一次性使用行场景的更新?,mysql,locking,Mysql,Locking,我有一个可由web应用程序激活的促销代码表。有一个状态列,可以是0表示未激活,也可以是1表示已激活。如果我使用 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; 它只是返回下一行,还是阻

我有一个可由web应用程序激活的促销代码表。有一个状态列,可以是0表示未激活,也可以是1表示已激活。如果我使用

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中完全工作。也许我可以做个更新。。。首先限制1,但在这种情况下,如何获取促销代码的id?

选择更新并锁定共享模式修改器,即使当前隔离模式是可重复读取的,也可以在读提交隔离模式下有效运行。这是因为Innodb只能锁定行的当前版本。考虑删除类似的案例和行。即使Innodb能够在不再存在的行上设置锁,这对您有好处吗?不太可能–例如,您可以尝试更新刚用SELECT for update锁定的行,但该行已不存在,因此更新您认为已成功锁定的行时会出现非常意外的错误。无论如何,这样做是有益的,所有其他决定都会更加麻烦

锁定共享模式实际上通常用于绕过多版本控制,确保我们正在读取大多数最新数据,并确保它不会被更改。例如,这个示例可以用于读取行集合,计算其中一些行的新值并将其写回。如果我们不在共享模式下使用锁,我们可能会遇到麻烦,因为在我们向行写入新值之前,行可能会被更新,这样的更新可能会丢失