答えについて:
「そのため、そのためのシンプルでエレガントなフェイルプルーフソリューションはないようです。私たちの場合、単純な再配信メカニズム(例外をスローし、一定時間後にJMSメッセージを再配信させる)に依存することにしました。」
これは、Transaction1が論理的に終了した後に開始する2番目のトランザクションに、Transaction 1の変更がまだ表示されていないことを検出し、技術的な例外でそれ自体を爆破する方法がある場合にのみ、フェイルプルーフになります。
トランザクション1とは異なるプロセスであるトランザクション2がある場合、これを確認できる可能性があります。ほとんどの場合、トランザクション1の出力は、トランザクション2を成功させるために必要です。フライドポテトは、じゃがいもがあれば作れます…じゃがいもがない場合は、爆破して次回からやり直してください。
ただし、DBが古くなっているために壊れているプロセスが、トランザクション1自体で実行されているプロセスとまったく同じである場合。ジャガイモを腸に追加しているだけで(たとえば、dbテーブル)、腸が溢れていることを検出できず、トランザクションを実行し続けてポンプを上げます...このようなチェックは手に負えない可能性があります。
ある種の何かが、たまたま私の場合です。
これに対する理論的な解決策は、JPAの@Versionフィールドに相当する人工エンティティを作成し、共通のエンティティを更新するためにシリアルに実行する必要のある各プロセスを強制することにより、DBでダーティリードを誘導しようとすることです。トランザクション2と1の両方が共通エンティティの共通フィールドを更新する場合、プロセスを中断する必要があります。2番目のトランザクションでJPAオプティミスティックロック例外が発生するか、DBからダーティリード更新例外が発生します。
私はまだこのアプローチをテストしていませんが、悲しいことに、それは必要な回避策になるでしょう。