2

私たちのアプリケーションは高度に並行しています。MQ データを取得し、データベースに保存しています。同じデータを含む可能性のある複数のメッセージがあります。したがって、1 つのメッセージには営業時間が含まれ、2 番目のメッセージには営業時間と場所が含まれる場合があります。

最初のメッセージが届き、営業時間のデータを保存します。次に、2 番目のトランザクションには、営業時間についてまったく同じデータが含まれます。位置情報を保存する必要があるのですが、営業時間が重複しています。並行性のため、データベースの稼働時間を確認できません (確認すると、存在しない可能性があり、保存するまでに別のスレッドによって挿入されている可能性があります)。私も速くなりたいです。(このローダーには多くの負荷がかかります。)

現在、メッセージは 1 つのトランザクション (Propagation.REQUIRED) を取得します (Spring と Hibernate を使用)。各種類のデータ挿入の後にフラッシュを行います。そのため、位置データを保存し、フラッシュを実行します。次に、営業時間を保存してフラッシュします。

エラー メッセージ (flush() の後にスローされる) をキャッチしてそれを食べた場合、保存された他のデータ (位置データ) は保存されますか? データベースの挿入に失敗した後でも、トランザクションは使用できますか? したがって、最初の保存が失敗した場合は、2 番目の挿入が機能するようにします。

Propagation.REQUIRES_NEW を見てきましたが、いくつか問題がありました。また、これが遅くなるのが心配です。3 つのトランザクションが必要です (このすべての前に少しロジックがあります)。

ほとんどの情報はロールバックについて話していますが、私はロールバックしたくありません。先に進みたいだけです。できますか?

4

1 に答える 1

3

いいえ、例外をキャッチして続行することはできません。休止状態のドキュメントの例外処理に関する章の内容は次のとおりです。

Session が例外 (SQLException を含む) をスローした場合は、すぐにデータベース トランザクションをロールバックし、Session.close() を呼び出して、Session インスタンスを破棄します。Session の特定のメソッドは、セッションを一貫した状態のままにしません。Hibernate によってスローされた例外は、回復可能として扱うことはできません。

于 2012-11-30T18:41:12.693 に答える