gpt4 book ai didi

sql - INSERT-SELECT 查询可以受竞争条件的约束吗?

转载 作者:行者123 更新时间:2023-11-29 11:25:13 24 4
gpt4 key购买 nike

如果 totals 表中不存在相应的行,我有此查询尝试将行添加到 balances 表。查询在使用 PostgreSQL 上默认隔离级别的事务中运行。

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

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

由于我没有在我的查询中使用任何这些,它是否没有竞争条件?如果不是,我该如何解决?

最佳答案

是的,它会因 duplicate key value violates unique constraint 错误而失败。我所做的是将插入代码放在 try/except block 中,当抛出异常时,我会捕获它并重试。就这么简单。除非该应用程序拥有大量用户,否则它将完美运行。

在您的查询中,默认隔离级别就足够了,因为它是单个插入语句并且没有幻读的风险。

请注意,即使将隔离级别设置为可序列化,try/except block 也无法避免。 From the manual about serializable:

like the Repeatable Read level, applications using this level must be prepared to retry transactions due to serialization failures

关于sql - INSERT-SELECT 查询可以受竞争条件的约束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23244835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com