web-dev-qa-db-ja.com

Java)でのファイル操作のトランザクションモード

ここで説明しようとしていることは意味がないのかもしれませんので、あらかじめお詫び申し上げます。とにかくやってみます。

ファイルから読み取り、データベース操作を実行して、コンテンツを別のファイルに移動しようとしています。 Javaでこれらすべての操作をアトミックな方法で実行できるかどうか疑問に思っていたので、アクションのリストで問題が発生した場合は、シーケンス全体をロールバックして開始点に戻ります。

よろしくお願いします。

42
Giroscopio

Apache Commons Transaction を見てください。ファイルをトランザクションで管理する機能があります。

アーカイブされた記事 ファイルシステムでの使用について詳しく説明しました。

更新

フロントページのステータスには次のように記載されていることに注意してください。

アドバタイズされた主な機能のトランザクションファイルアクセスを確実に実装できないと確信しているため、プロジェクトを休止状態に移行することにしました。通常のファイルシステムでは、このような実装は不可能であると確信しています。 (デッドロック検出を含むマルチレベルロックとして)他の便利な部分がありますが、トランザクションファイルシステムがこのライブラリを使用する主な理由です。完全にトランザクション化することはできないため、宣伝どおりに機能しません。

29
Brian Agnew

標準のTransactionFile APIはありませんが、必要なものを実装するApacheプロジェクトがあると思います。

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

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

更新

フロントページのステータスには次のように記載されていることに注意してください。

アドバタイズされた主な機能のトランザクションファイルアクセスを確実に実装できないと確信しているため、プロジェクトを休止状態に移行することにしました。通常のファイルシステムでは、このような実装は不可能であると確信しています。 (デッドロック検出を含むマルチレベルロックとして)他の便利な部分がありますが、トランザクションファイルシステムがこのライブラリを使用する主な理由です。完全にトランザクション化することはできないため、宣伝どおりに機能しません。

7
pjp

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

アプリケーションがJCAをサポートする環境にない場合は、Atomikosなどのスタンドアロントランザクションマネージャーを使用して、ファイル(XADiskを使用)とデータベースの両方を含むXAトランザクションを実行することもできます。

更新

プロジェクトのホームページはもう存在せず、Mavenでの最後のリリースは2013年でした。

6
nitin

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

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

次にそれを処理し、ファイルを変更します。問題が発生した場合は、DBをロールバックし、サフィックスが付いたすべてのファイルの名前を元の名前に戻すだけで、設定が完了します。

ボーナスとして、一部のFSの名前変更はアトミックでさえあるので、同時更新でも安全です(これがあなたに関連するかどうかはわかりません)。ファイルの名前変更はJavaですが;チェックする必要があります。

4
sleske

Two-Phase Commit を使用して、分散トランザクションを調整できます。ただし、これは実装がかなり複雑であり、私がよく見たアプローチは、シングルフェーズコミットを使用し、トランザクションのスタックを構築してから、それらすべてをすばやく連続してコミットし、コミットの試行の1つが失敗した場合にエラーを生成することです。他の人は成功します。

2フェーズコミットを実装することを選択した場合は、トランザクションの各参加者に対して 先行書き込みログ が必要になります。アクションを実行する前にアクションをログに記録し、次の場合に変更をロールバックできるようにします。トランザクションは失敗します。たとえば、ファイルに加えられた変更を元に戻す可能性があるために、これを行う必要があります(sleskeが言及しているように)。

4
Adamski

JBossTSは、 Narayana プロジェクト(以前はJBossTSと呼ばれていました)の一部として、 トランザクションファイルi/o の独自の実装を提案します。

3
Yves Martin