gpt4 book ai didi

mysql - 如何保证 Rails 中的 MySQL 锁获取顺序

转载 作者:数据小太阳 更新时间:2023-10-29 08:12:05 25 4
gpt4 key购买 nike

我们使用的是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com