"非同期jobをtransaction内で呼ぶなよ!絶対に呼ぶなよ!" at Kaigi on Rails 2025
Railsアプリケーションでは、ActiveRecordのtransaction内でperform_laterを呼び出すと、transactionのcommit前に非同期jobが実行され、DBの状態とジョブの実行タイミングがずれてエラーになることがあります。私たちのプロダクトでもこの問題に直面し、意図せぬエラーが発生するという事象がたまに発生するという状態に陥りました。再現性があまりなく、「たまに謎の非同期jobエラーが起こる」というデバッグもしづらい問題でした。 本セッションではこの問題の実例をもとに、どういった条件で再現するのか、どのような対策を取ったのかを紹介します。例えば、開発チーム内でコンセンサスを取った上での運用面で防ぐ工夫や、Rails7.2で新たに導入されたenqueue_after_transaction_commitオプションを使い、commit後にエンキューさせる方法などです。 「なぜかたまに非同期jobで謎のエラーが発生している」「うちも同様のことをやってるかも」「enqueue_after_transaction_commitオプションって実際にどうなの」と感じている方に向けて、明日から役立つ知識とチェックポイントをお届けします。