私のテーブルには、md5というラベルの付いた2次一意キーがあります。挿入する前に、MD5が存在するかどうかを確認し、存在しない場合は、以下に示すように挿入します。
-- Attempt to find this item
SELECT INTO oResults (SELECT domain_id FROM db.domains WHERE "md5"=oMD5);
IF (oResults IS NULL) THEN
-- Attempt to find this domain
INSERT INTO db.domains ("md5", "domain", "inserted")
VALUES (oMD5, oDomain, now());
RETURN currval('db.domains_seq');
END IF;
これはシングルスレッドの挿入に最適です。私の問題は、同じMD5を持つ2つの外部アプリケーションが同時に関数を呼び出す場合です。私は次のような状況に陥ります:
アプリ1:MD5が存在しないことを確認します
アプリ2:このMD5をテーブルに挿入します
アプリ1:MD5が存在しないと判断したため、テーブルにMD5を挿入しますが、MD5が存在しないことを確認した直後に、アプリ2が挿入したためエラーが発生します。
これを行うためのより効果的な方法はありますか?
挿入時にエラーをキャッチできますか?その場合は、domain_idを選択しますか?
前もって感謝します!
これは、PostgreSQLでの重複更新に関するInsertでもカバーされているようです。