如何在Rails中保证MySQL锁定获取顺序

时间:2015-01-08 19:40:37

标签: mysql ruby ruby-on-rails-4 rails-activerecord

我们正在使用Rails 4.1,我们使用的是带有has_many的模型。

Model X has_many Y

Y可以更新,然后通过回调更新X(增加版本字段,modified_at等)

X也可以自行更新。

这导致MySQL内部死锁,因为一个事务将锁定Y1然后想要锁定X1而另一个事务将锁定X1然后想要锁定Y1​​。

通过在更新Y之前至少要求拥有X的SELECT ... FOR UPDATE,这很容易解决。

我如何在Rails中执行此操作?或者是否有更好的解决方案?

我正在考虑保证我在Y上的before_update回调中有一个事务,然后获取X上的锁,但我不确定它是否适用于Rails。

2 个答案:

答案 0 :(得分:0)

您是否尝试使用transaction阻止?

因此,例如,您可以按如下方式定义自己的save_with_transaction方法:

class X < ActiveRecord::Base
  def save_with_transaction
    transaction do 
      # multiple save, update, delete calls here ...
    end
  end
end

有关ActiveRecord here

中交易的更多文档

答案 1 :(得分:0)

如何包装您的模型Y&amp; X更新内部事务。

X.transaction do 
 #Do Update on Y 
 #Update X
end

我还没有在你的特定情况下测试这个理论。但我认为应该这样做。如果有效,请告诉我。