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个重复记录。
理想情况下,期望值应该提高。但不应该创建任何记录。
1条答案
按热度按时间cetgtptt1#
ActiveModel验证将不处理由并行处理请求引起的争用条件。
一种选择是在数据库级别使用唯一索引来解决这个问题。
字符串
另一种方法是使用advisory lock来确保一次只有一个线程能够执行代码块