0

我正在设计一个 API,它从表中向客户端提供唯一代码。每个请求都应从表中返回一个唯一代码,如果没有更多代码可用,则返回错误。我想确保每个请求都有一个新代码,没有代码被重用。最好这会将代码标记为与布尔属性一起使用,而不是删除它们。这存储在 MySQL 数据库中,但理想情况下,我想要一个使用标准 SQL 的可移植解决方案。

目前,我已经制定出以下(简化,还有其他字段/外键等):

-- Schema for the code table
CREATE TABLE reward_code (
    id int(11) NOT NULL AUTO_INCREMENT,
    code varchar(1023) NOT NULL,
    in_use tinyint(1) NOT NULL,
    PRIMARY KEY (`id`),
);

-- Checking for a code and marking it as used in a single transaction
BEGIN;
SELECT * FROM reward_code WHERE in_use = 0 LIMIT 1 FOR UPDATE;
UPDATE reward_code SET in_use = 1 WHERE id = <id>;
COMMIT;

这似乎可行,因为第二个事务在 之间启动,SELECT并且COMMIT将等待第一个事务完成,然后从reward_code表中返回下一个可用行,因为第一个事务现在标记为已使用。

但是,如果可能,我想避免锁定行。有没有一种非锁定的方式来做到这一点?

4

0 回答 0