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

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

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

相关文章:

ruby-on-rails - 未 checkout ... bundle install 不修复帮助!

ruby-on-rails - Active Admin 类型错误 - Ruby on Rails

mysql - 一个表中的 SQL 行不在另一个表的多个字段中

java - 常规 JDBC 设置

ruby-on-rails - 添加到收藏夹(多款)

ruby - 使用指向 ruby​​ 可执行文件的符号链接(symbolic link)时查找相关库

MySQL触发器: Delete From Table AFTER DELETE

mysql - 从 N 个值中选择具有最低 M 值的行

ruby-on-rails-4 - Rails 引擎 4.2 中的 Rake 任务失败快速 gem 警告 : already initialized constant STATS_DIRECTORIES

postgresql - PG::CONNECTION BAD 连接到 pgAdmin III cloud9 IDE