Q&A
指定の複数のレコードにロックをかけたいなと思いました。
whereでlockしたいレコードを指定します。
問題
ruby
1ActiveRecord::Base.transaction do 2 User.where(foo: bar).lock('FOR UPDATE NOWAIT') 3 # 以下略 4end
上記のようにやると、ActiveRecord::Relation
を返すのでDBアクセスが発生しない、つまりロックされません
なので、以下のようにしようかなと思いました。
ruby
1ActiveRecord::Base.transaction do 2 User.where(foo: bar).lock('FOR UPDATE NOWAIT').load 3 # 以下略 4end
こうすれば一応DBアクセスしてくれて、ロックがかかります。
しかし、今回データを変数に格納してないことからも分かる通り、ロックしたレコードを処理で利用することはありません。ただロックしたいだけなのです。
loadだと、モデルオブジェクトを構築するので余計な時間がかかってしまいます。
そこで以下を考えました。
pluck("")
を使えば、モデルオブジェクトを構築しない上に、余計なデータをメモリに保存しないので良いかなと思いました。
ruby
1ActiveRecord::Base.transaction do 2 User.where(foo: bar).lock('FOR UPDATE NOWAIT').pluck("") 3 # 以下略 4end
しかし、pluck("")はセキュリティの問題があり、推奨されていないようです。
https://qiita.com/QUANON/items/8fcc8c6cee64d246a5a6
質問
前置きが長くて申し訳ないです。ここで質問なのですが
DBアクセスは発生させたいけど、データは取得しない場合、pluck("")
にかわる最適な手段はありますでしょうか?
回答1件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/03/22 07:36