![見出し画像](https://assets.st-note.com/production/uploads/images/163464242/rectangle_large_type_2_d8e561ff045f12d970996c83ae964ec7.png?width=1200)
ActiveStorageのファイル永続化とトランザクションについての調査
こんにちわ
BizDB CTOの松崎(@tmatsu06180702)です。
現在StockDBではストックオプションの契約締結機能を開発中(もうじきリリース!)なのですが、契約書の永続化にRailsのActiveStorageを使用しています。
開発する中でActiveStrageがファイルを永続化するタイミングとレコードの永続化のタイミング・トランザクションについて気になったので調査しました。
結論
ActiveStrageのattachのファイル永続化のタイミングはafter_commitで行われるのでデータ不整合が起きる可能性はある
発生した事象
ファイルの永続化先としてS3を使用しているのですが、S3へのアップロード時にエラーが起きレコードは作られているがS3にファイルがないという事象が発生した。
やりたいこと
S3へのアップロードをトランザクションの中に含めレコードはあるけどS3に実態がないという不整合状態をなくすことでした。
こうしたいと思った理由は仮にS3に浮いたファイルがあったとしてもコストとしては微々たるものだし、アプリケーション上から参照先がないエラーが起きることによる後の問い合わせ・調査工数のほうが重いと判断したからです。
調査結果
after_commitでS3にアップロードしているのでやりたいことは実現できなさそうという結論に至りました。
やりたいことは叶わなそうだけど、アップロードのタイミングも把握しデータ不整合が起きる可能性は低そうだと判断しました。
さいごに
ActiveStrageとか今更かよって感じかもしれませんが、前職の担当プロダクトでは普通にS3Clientで自前でUL/DLしてたので縁がありませんでした。
ストックオプションの契約締結機能は主要機能であるし使用頻度も高いのでタイミングを把握できて良かったかなと思います。
まぁにしてもRails便利ですね。リスクは承知の上で採用していこうと思います。
また、弊社では正社員採用も始めました。興味ある方は以下からチェックお願いします!
https://www.wantedly.com/projects/1900242