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との間で開始された 2 番目のトランザクションは、最初のトランザクションがCOMMIT完了するのを待ってから、最初のトランザクションがreward_code使用済みとしてマークされているため、テーブルから次の使用可能な行を返すため、これは機能しているように見えます。

ただし、可能であれば行のロックは避けたいと思います。これを行う非ロック方法はありますか?

4

0 に答える 0