仕様:
顧客ごとに商品情報を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が発生」したことにあります。
そして、この障害を取り除けば、処理としては正常に流れます。
しかし実装方法として適切かどうかというと疑問が残ります。
このような実装をしているということは、
おそらく、トランザクションの適用範囲が考慮されていません。
そして、今後も似たような障害が発生するたびに、同じ状況が発生することになります。
直接的な修正だけでは、根本解決にならないという事例ですね。