我正在尝试更新表中符合某些条件的几行(即some_col =“foo”的所有行)。我希望将此更新作为事务的一部分进行,其中我在所有这些行上获取共享模式的锁,逐行更新,并释放共享锁。
我到目前为止阅读的文档讨论了如何锁定ActiveRecord中的各个行。但这会使事情效率低下,因为我必须首先执行一些.where(...)查询,遍历每一行并锁定它(从数据库中重新获取行)。所以我每行将获得两次db ...
我想知道在.where(...)查询本身中锁定符合某个条件的所有行的最佳方法是什么。这可能吗?如果没有,是否有更好的方法可以更有效地锁定某组行。锁定桌子不是一种选择。
谢谢!
答案 0 :(得分:3)
试试这个
http://guides.rubyonrails.org/active_record_querying.html#pessimistic-locking
我们假设您的模型在示例中为Item
,请执行以下操作:
Item.lock.joins ....
e.t.c。并构建您想要的选择,以便将所有行放在大视图/结果中。
这可能是你想要的。