我们正在使用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。
答案 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
我还没有在你的特定情况下测试这个理论。但我认为应该这样做。如果有效,请告诉我。