我在带有 InnoDB 引擎的 MySQL 中有一个表 v_ext:
- id:主键
- 代码:预先生成的代码列表(比如随机生成 1000 个代码)
- user_id:最初为 NULL
当用户购买商品时,他们会收到一个代码。我需要更新表以填充 user_id 列。我有两个选择:
START TRANSACTION;
SELECT id FROM v_ext WHERE user_id IS NULL LIMIT 1 FOR UPDATE; -- return id 54 for ex.
UPDATE v_ext SET user_id=xxx WHERE id=54;
COMMIT;
或者
UPDATE v_ext SET user_id=xxx WHERE user_id IS NULL LIMIT 1;
如果我有成千上万的用户同时购买,第二种选择是否安全?如果是这样,假设第二个选项对性能更好,因为它只需要一个查询是正确的吗?