私はpromo_codes
というテーブルを持っています。これはWebアプリケーションでアクティブにすることができます。 state
列があり、非アクティブ化の場合は0、アクティブ化の場合は1になります。私は1回限りの行シナリオに適したSELECT ... FOR UPDATEはありますか?
SELECT FROM promo_codes WHERE state=0 LIMIT 1 FOR UPDATE;
UPDATE promo_codes SET state=1 WHERE id = ?;
でトランザクションを実行すると2番目のトランザクションの実行中に何が起こる:
SELECT FROM promo_codes WHERE state=0 LIMIT 1 FOR UPDATE;
それは単に次の行を返さない、または最初のトランザクションが完了するまでには、ブロックしていますか?
私は実際にredisの行IDに基づいてロックを設定することについて考え始めました。これは、それがどのように動作するのかが分かりましたが、MySQLではパフォーマンスの問題は発生しません純粋にSQLでこの作業を行うには、きれいで効率的な方法が必要です。たぶん私はちょうどUPDATE ... LIMIT 1
を使用することができますが、その場合、どのように私はプロモーションコードのIDを取得するのですか?