我正在尝试使用Sidekiq工作人员执行一些后台任务.
Sidekiq 真的强调让工作线程安全.工作人员基本上将使用#inc()原子(因此是线程安全的)更新Mongoid文档.但在实际更新之前,它们还将执行一个Model.find_or_create_by非原子的调用(它等于单独QUERY和INSERT操作).
我是否正确地认为这会导致竞争条件 - 两个工人一起跑,两个都会执行QUERY(两个都会失败)然后一个INSERT(一个会成功但另一个失败,因为我的模型有索引)唯一性条款)
为了避免上述情况,我将find_or_create_by包装在begin-rescue子句中:
begin
x = A.find_or_create_by(...)
rescue
x = A.find_by(...)
end
Run Code Online (Sandbox Code Playgroud)
这是正确的方法,还是有一种更简单的方法以线程安全的方式创建Mongoid文档?
编辑:我看过Mongoid中的find_or_create_by线程是否安全?,但它没有给出解决方案,它只是确认find_create_by不是线程安全的.