2009-08-21 29 views
39

おそらく私がここで説明しようとしていることは意味をなさないので、事前にお詫びしたいと思います。とにかく、私は試みます。Javaでのファイル操作のトランザクションモード

私はファイルから読み込み、いくつかのデータベース操作を実行して、別のファイルにコンテンツを移動しようとしています。私はそれがJavaで原子的な方法ですべての操作を実行することが可能かどうか疑問に思っていたので、何かがアクションのリストに間違っている場合は、完全なシーケンスをロールバックし、

ご協力いただきありがとうございます。

答えて

28

Apache Commons Transactionをご覧ください。これは、ファイルをトランザクションで管理する機能を備えています。

archived articleは、ファイルシステムでの使用方法を詳しく説明しています。

+0

より賢いリンク – pjp

+0

私は正しい方向に向いてくれてありがとう! – Giroscopio

+0

この記事はもう利用できません –

8

標準のトランザクションファイルAPIはありませんが、私はあなたが望むものを実装するApacheプロジェクトがあると信じています。

http://commons.apache.org/transaction/file/index.html

トランザクションファイルパッケージを使用すると、任意のファイルシステム上で、原子読み取りおよび書き込み操作を持つことができますコードを提供します。ファイル・リソース・マネージャーは、トランザクション内の一連のファイルに対して多数の操作を分離する機能を提供します。ロックパッケージを使用すると、シリアル化機能を含む完全なACIDトランザクションを提供することができます。もちろん、この作業を行うには、管理されたファイルへのすべてのアクセスがこのマネージャによって行われなければなりません。ファイルシステムへの直接アクセスは、マネージャーによって監視することはできません。

+0

私は正しい方向に向いてくれてありがとう! – Giroscopio

4

いいえ、少なくとも単純な呼び出しではありません。一般的なファイルシステム(特にJavaファイルシステム操作)は、「ロールバック」をサポートしていません。

ただし、これをエミュレートすることはできます。一般的な方法は、最初にファイルの名前を変更して、「処理中」としてマークされるようにすることです。たとえば、接尾辞を追加します。

それを処理して、ファイルを変更します。何かうまくいかない場合は、DBをロールバックし、接尾辞付きのすべてのファイルの名前を元の名前に戻してください。

ボーナスとして、いくつかのFSでは名前の変更もアトミックであるため、同時更新でも安全です(これはあなたにとって適切かどうかわかりません)。私はファイルの名前を変更することがJavaで原子的であるかどうかわかりません。あなたはチェックする必要があります。

+0

これはかなり単純な解決策のようです。私はKISSオプションが好きですので、試してみます。 – Giroscopio

+2

複数のファイルで動作しません。 –

+0

これは、ファイルの書き込みに何か問題が生じた場合は処理しません。その場合、名前を変更するだけで、現在破損している可能性のあるファイルが永続化されます。 –

2

Two-Phase Commitを使用して分散トランザクションを調整することができます。しかし、これは実装がかなり複雑で、しばしば取られてきたアプローチは、単一フェーズ・コミットを使用し、一連のトランザクションを構築し、すべてを素早くコミットして、コミットの試行が1つ失敗した場合にエラーを生成することです他は成功する。

2フェーズコミットの実装を選択した場合は、トランザクションに参加するたびにアクションをログに記録し、トランザクションが失敗した場合に変更をロールバックできるようにするために、Write-Ahead Loggingが必要です。たとえば、ファイルに加えられた変更を潜在的に元に戻すために、これを行う必要があります(sleskeのように)。

6

XADiskは、ファイルシステム上のXAトランザクションをサポートしているため、問題を解決するはずです。データベースや他のXAリソースとともにXAトランザクションに参加することができます。

アプリケーションがJCA支援環境にない場合は、Atomikosなどのスタンドアロンのトランザクションマネージャを使用して、XADKを使用したファイルとXADKを使用するXAトランザクションを実行することもできます。

+0

いいですね。あなたの作品を使用する参考資料、プロジェクトがありますか?ユーザーからのフィードバックはありますか? –

+1

@Gábor - [stories/feedbacks](http://xadisk.java.net/success-stories.html)のいくつかをここで見つけることができます。 –

3

JBossTSはNarayanaプロジェクト(以前はJBossTSと呼ばれていた)の一部としてtransactional file i/oの独自の実装を提案しています。