小编Apo*_*G10的帖子

在Mongoid中创建线程安全文档

我正在尝试使用Sidekiq工作人员执行一些后台任务.

Sidekiq 真的强调让工作线程安全.工作人员基本上将使用#inc()原子(因此是线程安全的)更新Mongoid文档.但在实际更新之前,它们还将执行一个Model.find_or_create_by非原子的调用(它等于单独QUERYINSERT操作).

我是否正确地认为这会导致竞争条件 - 两个工人一起跑,两个都会执行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不是线程安全的.

multithreading ruby-on-rails thread-safety mongodb mongoid

5
推荐指数
0
解决办法
461
查看次数