我正在尝试重试的first_or_initialize
失败,这“显然是不可能的”。不知何故,即使允许多次重试,它还是发生了。
该表包含列id
(整数主键),uuid
(二进制)和item_id
(整数)列。 uuid
和item_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
在本地运行时有效:
不幸的是,错误收集器收到了以下消息:
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
。