私たちのアプリケーションは高度に並行しています。MQ データを取得し、データベースに保存しています。同じデータを含む可能性のある複数のメッセージがあります。したがって、1 つのメッセージには営業時間が含まれ、2 番目のメッセージには営業時間と場所が含まれる場合があります。
最初のメッセージが届き、営業時間のデータを保存します。次に、2 番目のトランザクションには、営業時間についてまったく同じデータが含まれます。位置情報を保存する必要があるのですが、営業時間が重複しています。並行性のため、データベースの稼働時間を確認できません (確認すると、存在しない可能性があり、保存するまでに別のスレッドによって挿入されている可能性があります)。私も速くなりたいです。(このローダーには多くの負荷がかかります。)
現在、メッセージは 1 つのトランザクション (Propagation.REQUIRED) を取得します (Spring と Hibernate を使用)。各種類のデータ挿入の後にフラッシュを行います。そのため、位置データを保存し、フラッシュを実行します。次に、営業時間を保存してフラッシュします。
エラー メッセージ (flush() の後にスローされる) をキャッチしてそれを食べた場合、保存された他のデータ (位置データ) は保存されますか? データベースの挿入に失敗した後でも、トランザクションは使用できますか? したがって、最初の保存が失敗した場合は、2 番目の挿入が機能するようにします。
Propagation.REQUIRES_NEW を見てきましたが、いくつか問題がありました。また、これが遅くなるのが心配です。3 つのトランザクションが必要です (このすべての前に少しロジックがあります)。
ほとんどの情報はロールバックについて話していますが、私はロールバックしたくありません。先に進みたいだけです。できますか?