2016-04-01 18 views
0

データベースに注文を保存する要求を受け取るWebアプリケーションがあります。 1つのCassandraインスタンスと1つのPostgreSQLインスタンスの2つの異なるデータベースに書きたいと思います。私は軽量Webアプリケーションライブラリを前面に持つプレーンJavaとJDBC(Apache DBUtisを使用)を使用しています。複数のデータベースでトランザクションを管理する方法

2つのデータベース間でトランザクション性を実装する方法がわかりません。つまり、いずれかのデータベースへの書き込みに失敗した場合は、もう一方の書き込みをロールバックし、エラーメッセージをエラーログに記録します。

これを実装するためのJavaのメカニズムはありますか?私は2フェーズコミットのようなものを知っている、それは私がここで探しているだろうか?選択肢はありますか?

+1

[こちら](http://stackoverflow.com/questions/128377/what-is-the-best-way-to-do-distributed-transactions-across-multiple-databases)をお勧めします。 _これはありません。あなたの質問を更新して、2つのデータベースの使い方をどのように計画するのか教えてください。 –

+1

https://en.wikipedia.org/wiki/Java_Transaction_API – Gimby

+1

1つのトランザクションで両方のデータベースに書き込む必要がないことがわかったので、私はそれをマークしませんでした。おそらく、ビジネスロジックの代替案を見つけることで、2つのデータベーストランザクションが回避される可能性があります。 –

答えて

2

両方ともCassandra & PostgreSQLは線形性とCASの比較をサポートしているため、クライアント側でトランザクションを実装できます。

シリアライズ可能な分離レベルが必要な場合は、Percolator's transactionsを参照してください。パーコレータの取引は、業界ではかなり知られており、AmazonのDynamoDB transaction libraryCockroachDB database、GoogleのPecolatorシステム自体で使用されています。 Percolatorの取引のstep-by-step visualizationがあなたの理解を助けるかもしれません。

コンテンションがあり、Read Committedの分離レベルを処理できる場合は、Peter BailisのRAMP transactionsがあなたに合っているかもしれません。私もstep-by-step RAMP visualizationを作成しました。

第3のアプローチは、サガパターンとも呼ばれる補償トランザクションを使用することです。これは80年代後半のSagas論文に記述されていましたが、分散システムの導入により現実のものとなりました。インスピレーションのためのApplying the Saga Patternトークをご覧ください。

関連する問題