У меня на столе есть вторичный уникальный ключ с меткой md5.Перед вставкой я проверяю, существует ли 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.Я в конечном итоге в ситуации, когда:
Приложение 1: видит MD5 не существует
Приложение 2: вставляет этот MD5 в таблицу
Приложение 1: идет сейчас ВставитьMD5 в таблицу, поскольку он думает, что он не существует, но получает ошибку, потому что сразу после того, как он увидел, что его нет, приложение 2 вставило его.
Есть ли более эффективный способ сделать это?
Могу ли я отловить ошибку при вставке и, если да, то выбрать domain_id?
Заранее спасибо!
Кажется, это также рассматривается в Вставить, при повторном обновлении в PostgreSQL?