3

このようなコードがあります:

ATransaction.commit ();
BTransaction.commit ();

両方のトランザクションは異なるスキームで動作しています(つまり、永続性ユニットは異なります)。1つのトランザクションで両方を組み合わせる必要があります。したがって、いずれかのトランザクションが両方のロールバックに失敗した場合。どうやってするの?

4

1 に答える 1

1

自分でトランザクションを管理しているようです。通常、JavaEEコンテナがそのようなケースを処理します。この場合、JTAは2フェーズコミットを使用します。これはまさにこのような状況に適しています。

自分でトランザクションを管理している場合は、もう少し複雑です。問題は、最初のコミットを実行し、2番目のコミットが失敗した場合、最初のコミットをロールバックできなくなることです。

あなたの場合、私は次のことを提案します。オブジェクトを変更した場合、Hibernateはデータベースに変更をすぐに書き込まないため、通常、コミットは失敗するだけです。これは、Hibernateが「フラッシュ」を実行するときに発生します。これは、クエリが実行される前に自動的に実行されます。クエリが実行される前に、すでに変更したオブジェクトの影響を受ける可能性があります。また、トランザクションがコミットされる前にも実行されます。

したがって、最初に両方のエンティティマネージャをフラッシュするだけで、両方のデータベースにすべての変更が書き込まれ、次に両方のトランザクションがコミットされます。これにより、失敗することはなくなります。

このようなもの:

entityManager1.flush();
entityManager2.flush();
entityManager1.getTransaction().commit();
entityManager2.getTransaction().commit();

ただし、このようなケースを手動で管理するのではなく、代わりにコンテナに管理させることをお勧めします。

于 2012-10-20T08:37:40.190 に答える