ruby Rails ActiveRecord唯一性验证引发错误,记录仍在创建

yhuiod9q  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(80)

Ruby版本:第一个月
Rails版本:6.1.7.2
我在项模型中定义了一个唯一性验证检查,这样每个用户只能唯一地创建一个项。

# Modal - item.rb

validates :name, uniqueness: { case_sensitive: false, scope: :user_id }

个字符
当我收到来自同一用户的多个并行请求时,有相同的项目名称,那么就会引发异常:

"exception":"ActiveRecord::RecordInvalid: Name Item names must be unique for a user."


记录也会被创建。
P.S.:
1.当请求不是并行的时,验证工作成功。
1.当我收到8个类似的请求时。对于第一个(原始)请求,已创建记录。对于接下来的7个请求,引发了异常,但也创建了3个重复记录。
理想情况下,期望值应该提高。但不应该创建任何记录。

cetgtptt

cetgtptt1#

ActiveModel验证将不处理由并行处理请求引起的争用条件。
一种选择是在数据库级别使用唯一索引来解决这个问题。

add_index :items, :user_id, unique: true

字符串
另一种方法是使用advisory lock来确保一次只有一个线程能够执行代码块

相关问题