0

INSERT IGNORE実際にはキーの競合が発生しないため、機能しません。

これはプログレス キュー用です。S1 つのアプリケーションの場合、ステータス(「開始済み」) を含む 2 つの行は必要ありません。ただし、他のアプリケーションでもできるはずです。特に、2 つの作業項目を同時に発生させたい場合は、できます。それがデータベースの制約ではない理由です。

したがって、SQL で「存在しない場所を挿入する」と言うのは少し難しいです。これは機能します:

insert into user_queue_google
(user_id, status, start_timestamp)
(select 221, 'S', NOW() FROM filter_type
WHERE 221 not in (select user_id from user_queue_google where status = 'S') limit 1);

問題はfilter_type、私が知っている完全に無関係なテーブルが小さく、たまたま空にならないことです。何らかの理由で空の場合、これは失敗します。

ストアド プログラムや SQL プログラムの IF/THEN ロジックに頼らずに、この非常に恐ろしいハッキングを回避できますか?

4

3 に答える 3

0

効果的に機能させるには、UNIQUEインデックスが必要です。INSERT IGNOREあなたができることは、無害なものにデフォルト設定されている追加の列を追加することですが、キーを一意に変更することができます:

CREATE UNIQUE INDEX index_block ON user_queue_google (user_id, force);

forceを持つ列として設定しますDEFAULT 0。2 つのジョブを強制的に同時に実行する場合は、競合を避けるために別の値に設定します。

UPDATE user_queue_google SET status='S', force=UNIX_TIMESTAMP() WHERE user_id=221

これにより、新しいジョブを挿入するための新しいスロットが解放されます。

于 2013-10-03T15:37:01.257 に答える