gpt4 book ai didi

ruby-on-rails-3 - First_or_create 还错误 : duplicate key value violates unique constraint

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

我有以下代码:

rating = user.recipe_ratings.where(:recipe_id => recipe.id).where(:delivery_id => delivery.id).first_or_create

然而不知何故,我们偶尔会从中得到 PG::Error: ERROR: duplicate key value violates unique constraint 错误。我想不出任何应该发生的原因,因为 first_or_create 的全部意义在于防止这些。

这只是一个疯狂的竞争条件吗?如果没有一系列令人抓狂的 begin...rescue block ,我该如何解决这个问题?

最佳答案

这似乎源于“SELECT or INSERT”案例的典型竞争条件

在其实现中,Ruby 似乎更注重性能 而不是安全。引用 "Ruby on Rails Guides" :

The first_or_create method checks whether first returns nil or not. Ifit does return nil, then create is called.

...

The SQL generated by this method looks like this:

SELECT * FROM clients WHERE (clients.first_name = 'Andy') LIMIT 1
BEGIN
INSERT INTO clients (created_at, first_name, locked, orders_count, updated_at)
VALUES ('2011-08-30 05:22:57', 'Andy', 0, NULL, '2011-08-30 05:22:57')
COMMIT

如果那是实际的实现(?),它似乎完全对竞争条件开放。另一个事务可以轻松地在第一个事务的 SELECTINSERT 之间进行 SELECT。然后尝试它自己的 INSERT,这会引发您报告的错误,因为同时第一个事务已插入该行。

使用数据修改 CTE 可以大大缩短竞争条件的时间范围。即使是安全版本也不会花费那么多。但我想他们有他们的理由。
比较这个安全的实现:

关于ruby-on-rails-3 - First_or_create 还错误 : duplicate key value violates unique constraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25372334/

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