【发布时间】:2011-07-21 05:38:02
【问题描述】:
在我的桌子上,我有一个标记为 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。我最终会遇到以下情况:
App 1:发现 MD5 不存在
应用 2:将此 MD5 插入表中
App 1:进入现在将 MD5 插入到表中,因为它认为它不存在,但得到一个错误,因为在它看到它不存在之后,App 2 插入了它。
有没有更有效的方法来做到这一点?
我能否在插入时发现错误,如果是,则选择 domain_id?
提前致谢!
【问题讨论】:
标签: postgresql concurrency unique-key