新手问题 ActiveRecord MySQL 锁的问题

rubysm · 2018年03月15日 · 最后由 lingceng 回复于 2018年03月15日 · 944 次阅读

菜鸟请教各位大侠,在 ruby 2.5.0, rails 5.1.4 环境下,连 Mysql,发现事件加锁的机制和预想中的不一样,简单的例子,我在 Mysql workbench 上先加锁,如下:

start transaction;

select status from tasks where id=31 for update;

然后再 ruby 程序中执行

Task.transaction do

    tasks=Task.where("id=? ",31).lock(true);

    ......

    task.save!

end

发现 ruby 可以执行 select 并得到查询结果,预想中程序应该停在那里,等到前面 workbench 中的锁释放了,再执行 select。然而,当执行到后面 task.save! 的时候,锁住了,程序停在那里。我希望程序在 select 的时候就挂起直到另一边的锁被释放。不知是哪里出了问题,请问应该如何调整程序?万分感谢。

1 楼 已删除

可能是 lazy loading 的问题,https://ruby-china.org/topics/28327

我用类似的方式测试了下,能够在查询的时候锁住。Ruby2.3.0 Rails5.0.1 MySQL5.7.17 InnoDB。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号