Module: Spree::OrderEmailSubscriberDecorator

Defined in:
app/decorators/spree/order_email_subscriber_decorator.rb

Overview

Spree 5.3.6 の注文確認 / 店舗オーナー通知メールが、本番のインスタンス複数台 + Sidekiq 非同期 環境で2通送信される race condition への対策。

本家 OrderEmailSubscriber#send_confirmation_email は ① return if order.confirmation_delivered? (チェック) ② OrderMailer.confirm_email(...).deliver_later (送信) ③ order.update_column(:confirmation_delivered, true) (フラグ更新) の順で、①〜③が非アトミック。さらに本家は complete 遷移時に order.completed を2回 publish するため (finalize! 内 + after_transition)、2インスタンスが①を同時に false で通過すると②を両方実行し2通になる。

「flag=false の行を true に更新できた1プロセスだけが送信権を得る」条件付き UPDATE 一発に変更し、 MySQL の行ロックで直列化することで、同時実行でも送信を1通に絞る。 確認メール / 店舗オーナー通知の両方が同型の race を持つため、両方に適用する。