首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >INSERT-SELECT查询是否受竞争条件的制约?

INSERT-SELECT查询是否受竞争条件的制约?
EN

Stack Overflow用户
提问于 2014-04-23 12:50:24
回答 1查看 895关注 0票数 7

如果balances表中没有相应的行,那么我有一个查询试图将行添加到totals表中。使用PostgreSQL上的默认隔离级别在事务中运行查询。

代码语言:javascript
复制
INSERT INTO balances (account_id, currency, amount)
SELECT t.account_id, t.currency, 0
FROM balances AS b
RIGHT OUTER JOIN totals USING (account_id, currency) AS t
WHERE b.id IS NULL

我对UNIQUE有一个balances (accountId, currency)约束。我担心,如果多个会话同时执行此查询,我将陷入竞争状态,从而导致重复的关键错误。我见过许多关于这个主题的问题,但它们似乎都涉及子查询、多个查询或pgSQL函数。

因为我没有在我的查询中使用任何这些,它是否没有种族条件?如果不是的话,我该怎么解决呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-23 13:24:05

是的,如果出现duplicate key value violates unique constraint错误,它将失败。我所做的就是将插入代码放在一个try/except块中,当抛出异常时,我会捕获它并重试。就这么简单。除非应用程序有大量的用户,否则它将完美无缺地工作。

在您的查询中,默认隔离级别就足够了,因为它是一个insert语句,并且不存在幻影读取的风险。

注意,即使将隔离级别设置为可序列化,try/ not块也是不可避免的。从有关可序列化的手册中:

与可重复读取级别一样,使用此级别的应用程序必须准备好重新尝试由于序列化失败导致的事务。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23244835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档