Mysql2 ::错误:密钥的重复条目 - ActiveRecord :: RecordNotUnique没有捕获错误?

Huy*_*Huy 4 exception-handling ruby-on-rails ruby-on-rails-3

我正在使用rails应用程序,并且经常遇到以下错误:

Mysql2::Error: Duplicate entry '3022093-2000000028003-visited' for key 'unique_user_place_relationship'
Run Code Online (Sandbox Code Playgroud)

虽然我已将问题的根源缩小到以下几行:

begin
  up = UserPlace.new(user_place_params)
  up.skip_logging
  up.save!
rescue ActiveRecord::RecordNotUnique => e
  Rails.logger.warn(e)
end
Run Code Online (Sandbox Code Playgroud)

在我的表中,我有以下索引:

key_name                         seq_in_index    column_name
unique_user_place_relationship   1               user_id
unique_user_place_relationship   2               place_id
unique_user_place_relationship   3               relationship
Run Code Online (Sandbox Code Playgroud)

问题是我没有validate_uniqueness_ofuser_id,place_id和关系user_place.rb吗?

根据我的理解,ActiveRecord:RecordNotUnique应该捕获此错误,因为事务不满足db级别的索引约束.

Pio*_*ioz 5

文档说:

结合使用此验证方法 ActiveRecord::Validations#save并不能保证不存在重复的记录插入,因为uniqueness对应用程序级别的检查本质上容易出现竞争条件.例如,假设两个用户尝试同时发布评论,并且评论的标题必须是唯一的.在数据库级别,这些用户执行的操作可以按以下方式交错...