投稿の編集時に発生する可能性のある競合状態

問題

1 つのウィキページへの同時編集により、予期しない動作が発生する可能性があります。私のケースでは、2 つの投稿間の quoted_posts リレーションが正しく機能しなくなっています。

これにより、User#refresh_avatar のように quoted_posts が使用される場面で他の問題が発生する可能性があります。quoted_posts が欠落しているため、引用された投稿をすべて再構築(rebake)することができません。

考えられる原因

この コミット で導入された警告は、投稿への同時編集を防ぐには不十分です。チェックがアトミックではないためです。これは稀な状況ですが、発生し得ます。

PostRevisor#revise!QuotedPost.extract_from(@post) を呼び出し、投稿内に引用がない場合、すべての quoted_posts を削除します。2 つの編集が同時に PostRevisor#revise! を呼び出した場合、1 つの編集で引用を追加し、もう一方の編集でも引用を追加しようとしたとしても、最終的な投稿内容は引用を含む編集の結果になる一方で、quoted_post リレーションは引用のない編集によって破棄されてしまう可能性があります。

考えられる修正

投稿を編集する際に Redis ロックを取得することを検討すべきかもしれません。

「いいね!」 3

これはおそらく可能で、ここで分散ロックを追加することに強く反対はしません。ただし、デッドロックのリスクを避ける必要があるため、非常に慎重になる必要があります。

もし同時編集が本当に必要なら、共有編集を試してみるのはどうでしょうか?

「いいね!」 3