Kox Blog

バグを知り、業務を知らば、システム危うからず

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  243  : 記事  0  : コメント  929  : トラックバック  35

ニュース

書庫

日記カテゴリ

リンク

仕様:
顧客ごとに商品情報をDB更新し、各顧客に対して変更内容をメール配信する。

ソース:
List list = 顧客リスト;
for( int i=0; i<list.size(); i++ ){
  update( list.get(i) );    //顧客ごとに商品情報をDB更新
  sendMail( list.get(i) );  //顧客ごとに更新した商品情報をメール配信
}


2件目以降のupdate処理中に、何かしらの理由でExceptionが発生し、
トランザクションはrollbackされたが、既にメールは配信してしまっているため、データの不整合が発生。

直接的な原因は、「何かしらの理由でExceptionが発生」したことにあります。
そして、この障害を取り除けば、処理としては正常に流れます。

しかし実装方法として適切かどうかというと疑問が残ります。
このような実装をしているということは、
おそらく、トランザクションの適用範囲が考慮されていません。
そして、今後も似たような障害が発生するたびに、同じ状況が発生することになります。

直接的な修正だけでは、根本解決にならないという事例ですね。

投稿日時 : 2007年8月6日 13:36

コメント

# re: メール配信した内容とDB内容不一致の不具合事例 2007/08/06 14:38 はつね
DB更新とメール送信を同一トランザクション内で行ってはダメ。
MSMQとかAdvnceQueueなどのキュー構造にメール送信に必要な情報をすべて叩き込んでCommitして、実際のメール送信はそのQueueからデータを取得して送信する別プロセスで実施しましょう。


# re: メール配信した内容とDB内容不一致の不具合事例 2007/08/06 18:13 kox
>DB更新とメール送信を同一トランザクション内で行ってはダメ。
まあ、そういうことですね。

Post Feedback

タイトル
名前
Url:
コメント