3

作業単位が次のように定義されているシナリオがあります。

Update table T1 in database server S1
Update table T2 in database server S2

そして、上記の作業単位が完全に発生するか、まったく発生しないことを望みます (データベース トランザクションの場合と同様)。これどうやってするの?広範囲に検索したところ、この投稿は私が期待しているものに近いことがわかりましたが、これは Hibernate に非常に固有のもののようです。

コンテナーとして Spring、iBatis、および Tomcat (6.x) を使用しています。

4

2 に答える 2

6

それは、必要なソリューションの堅牢性に大きく依存します。そのようなことの最小レベルの信頼性は XA トランザクションです。それを使用するには、最初にそれをサポートするデータベースと JDBC ドライバーが必要です。次に、それを使用するように Spring を構成できます (ここに概要があります)。

XA の堅牢性が不十分な場合 (ハードウェア障害など、コミットの第 2 フェーズで問題が発生した場合など、XA には障害シナリオがあります)、実際に行う必要があるのは、すべてのデータを 1 つのデータベースに配置し、次に、別のプロセスでそれを伝播させます。そのため、データに一貫性がない可能性がありますが、回復可能です。

編集:つまり、データ全体を1つのデータベースに入れるということです。最初のデータベース、またはこの目的のための別のデータベース。このデータベースは基本的に、最終的なデータ ビューが供給されるキューになります。そのデータベースへの書き込み (適切なデータベース製品を想定) が完了するか、完全に失敗します。次に、別のスレッドがそのデータベースをポーリングし、欠落しているデータを他のデータベースに配布します。したがって、プロセスが失敗した場合、そのスレッドが再起動すると、配布プロセスが続行されます。必要なすべての場所にすぐにデータが存在するわけではありませんが、何も失われることはありません。

于 2009-09-30T17:55:44.687 に答える
2

分散トランザクション マネージャーが必要です。JVM 内で実行できるAtomikosを使用するのが好きです。

于 2009-10-01T04:26:00.070 に答える