Upgrade to Pro — share decks privately, control downloads, hide ads and more …

非同期jobをtransaction内で 呼ぶなよ!絶対に呼ぶなよ!

Avatar for Yuto Urushima Yuto Urushima
September 28, 2025

非同期jobをtransaction内で 呼ぶなよ!絶対に呼ぶなよ!

Ruby on Railsで開発していると、transaction内で非同期jobを呼ぶとコミット前に非同期jobが走り、レコードが見つからずRecordNotFoundやActiveJob::DeserializationErrorが起きることがあります。しかも再現する時としない時があり、デバッグがとてもやりにくい。そこで対策として、まず非同期jobのエンキューをtransaction外に移す方法を紹介し、さらにafter_commit_everywhereなどのgemを使う方法や、Rails 7.2以降で使えるenqueue_after_transaction_commit = trueの設定を活用する方法を説明。結果、DBのコミット後に確実に非同期jobが動くようになり、謎のエラーが解消。transaction内での非同期jobは危険なので、必ず対策するべきです。

※スライドに埋め込んだ動画が見られないのでこちらにアップしました。
false: https://vimeo.com/1122797317
true: https://vimeo.com/1122797866

Avatar for Yuto Urushima

Yuto Urushima

September 28, 2025
Tweet

More Decks by Yuto Urushima

Other Decks in Programming

Transcript