我们使用的是 Rails 4.1,我们的模型带有 has_many。
模型 X 有_许多 Y
Y 可以更新,然后通过回调更新 X(增加版本字段,modified_at 等)
X也可以自己更新。
这会导致 MySQL 内部出现死锁,因为一个事务将锁定 Y1 然后想要锁定 X1,而另一个事务将锁定 X1 然后想要锁定 Y1。
这很容易解决,只需在更新 Y 之前至少要求对拥有的 X 执行 SELECT ... FOR UPDATE
。
我如何在 Rails 中执行此操作?或者有更好的解决方案吗?
我正在考虑尝试保证我在 Y 的 before_update 回调中有一个事务,然后获取 X 的锁,但我不确定这是否适用于 Rails。
最佳答案
你试过使用transaction
block 吗?
因此,例如,您可以定义自己的 save_with_transaction
方法,如下所示:
class X < ActiveRecord::Base
def save_with_transaction
transaction do
# multiple save, update, delete calls here ...
end
end
end
有关 ActiveRecord 中事务的更多文档 here
关于mysql - 如何保证 Rails 中的 MySQL 锁获取顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27848255/