私は次の関係を持っています
parent has_many children
child belongs_to parent
そして次のコードブロック
ActiveRecord::Base.connection.transaction do
lock_acquired = true
if child.parent.lock! and child.parent.status == 1
child.parent.update_attributes(:status => 2)
else
lock_acquired = false
end
if lock_acquired
# other code follows here
end
end
上記のコード ブロックは、一度に 1 つの子のみが親のステータスを変更できるようにするためのものであり、したがってロックされます。メソッドとステータス チェック式。でもなぜか壊れてます。子の 1 人によって親ステータスが 2 に変更されても、別の子は if ステートメントを何とか通過できます。もちろん、複数のプロセスが実行されていますが、ロックがそれを処理すると思いました。トランザクション ブロックが完了する前にロックが返されたようです。
ロックの動作が思ったより違うかもしれません。どんな洞察も非常に役に立ちます。
ありがとう。