重复的first_or_initialize冲突

时间:2018-09-11 05:44:08

标签: mysql rails-activerecord amazon-rds-aurora

我正在尝试重试的first_or_initialize失败,这“显然是不可能的”。不知何故,即使允许多次重试,它还是发生了。

该表包含列id(整数主键),uuid(二进制)和item_id(整数)列。 uuiditem_id都有唯一的索引。

该方法应检索项目的uuid或创建一个不存在的uuid:

def self.get_uuid_for(item)
  Retryable.retryable(tries: MAX_RETRIES, on: [ActiveRecord::RecordNotUnique], sleep: 0) do
    ActiveRecord::Base.transaction(requires_new: true) do
      item_uuid = where(item_id: item).first_or_initialize do |item_uuid|
        item_uuid.uuid = SecureRandom.uuid
        item_uuid.save!
      end
      item_uuid.uuid
    end
  end
end

在本地运行时有效:

  • 没有现有条目(SELECT,INSERT)
  • 具有现有条目(SELECT)
  • 具有竞争性事务(SELECT,INSERT,ROLLBACK,SELECT)

不幸的是,错误收集器收到了以下消息:

ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry '22573725' for key 'index_item_uuids_on_item_id'

我正在努力解释。 MAX_RETRIES恰好是100,因此即使始终以某种方式创建和删除该关联,所有这些重试实际上都将失败的情况发生在彩票级别。 也不是并发事务需要很长时间,因为在这种情况下,item_uuid.save!的INSERT挂起等待锁。

我想念什么情况?

数据库为MySQL / AWS Aurora 5.6。隔离级别为REPEATABLE-READ

0 个答案:

没有答案