0

それぞれ異なるネットワーク共有にある 5 つの同一の xml ファイルを変更するアプリケーションがあります。これが不必要に冗長であることは承知していますが、「そうでなければなりません」。

このアプリケーションが実行されるたびに、正確に 1 つの要素 (それ以上でもそれ以下でもない) が追加/削除/変更されます。

最初に、アプリケーションは各 xml ファイルを開き、要素を適切なノードに追加/削除/変更してファイルを保存するか、保存できない場合はエラーをスローします (ネットワーク共有にアクセスできない、タイムアウトなど...)。

これをアトミックにするにはどうすればよいですか?

私の最初の仮定は次のとおりでした。

foreach (var path in NetworkPaths)
    if (!File.Exists(path)
        isAtomic = false;

if (isAtomic)
{
    //Do things
}

しかし、私はそれがこれまでのところしか進んでいないことがわかります。これを行う別の方法、または私が指し示すことができる方向はありますか?

4

3 に答える 3

2

残念ながら、それが本当に「アトミック」であるということは実際には不可能です。私の最善のアドバイスは、このために独自のトランザクション形式をまとめることです。そうすれば、少なくとも変更を元に戻すことができます。

各ファイルをチェックするようなことをします-ファイルが存在しない場合は、スローします。

各ファイルをバックアップするか、元に戻すために必要な状態を保存するか、ファイルが大きくない場合はコピーをメモリに保存します。できない場合は投げてください。

編集してから、ファイルを保存します。ここで障害が発生した場合は、各バックアップから復元してみてください。すべてのバックアップが復元されるまでスローしないように、ここでエラー処理を行う必要があります。復元後、例外をスローします。

少なくともこの方法では、1つのファイルだけに変更を加えない可能性が高くなります。うまくいけば、1つのファイルを変更できれば、バックアップからファイルを復元したり、変更を元に戻したりできるようになります。

于 2009-05-11T15:18:36.777 に答える
1

次の解決策を提案します。

  • すべてのファイルを書き込みロックで開いてみてください。
    • 1 つ以上が失敗した場合は、中止します。
    • すべてのファイルを変更してフラッシュします。
      • 1 つ以上が失敗した場合は、既に変更されているものをロールバックして、再度フラッシュします。
  • すべてのファイルを閉じます。

ロールバックが失敗した場合は...まあ...もう一度試して、もう一度試して、もう一度試して...そして矛盾した状態であきらめてください。

このファイルを書き込むすべてのプロセスを制御できる場合は、ロック ファイルを使用して単純なロック メカニズムを実装できます。先行書き込みログを実行して、計画された変更をロック ファイルに記録することもできます。プロセスがクラッシュした場合、ファイルを変更しようとする次のプロセスが不完全な操作を検出し、1 つの変更を行う前にプロセスを続行できます。

于 2009-05-11T15:25:59.417 に答える
0

ファイルのバージョン管理を紹介します。これは、ファイル名にサフィックスを追加することで簡単に実行できます。たとえば、カウンター変数。リーダーのプロセスは次のとおりです。

  • ファイルの次のバージョンを準備する
  • 別の名前で一時ファイルに書き込みます。
  • 最高のバージョン番号を取得する
  • このバージョンを 1 つ増やします
  • 一時ファイルの名前を新しいファイルに変更します
  • 古いファイルを削除します(たとえば、2つ保持できます)

読者として - 最新バージョンのファイルを見つけて - それを読んでください

于 2013-09-04T19:10:00.890 に答える