0

データ ストレージに XML を使用する古いシステムがあります。別のミニプロジェクトにデータを使用する予定で、データのクエリ/更新に LINQ to XML を使用したいと考えていました。しかし、自分で処理する必要があるかどうかわからないシナリオが 2 つあります。

1- 次のコードに似たものがあり、2 人が同時に Save() を押した場合はどうなりますか? LINQ to XML は、保存する前にファイルが再び使用可能になるまで待ちますか?それとも単にスローしますか? 必要がない限り、ロックを入れたくありません:)

// I assume the next line doesn't lock the file
XElement doc = XElement.Load("Books.xml");
XElement newBook = new XElement("Book",
new XAttribute("publisher", "My Publisher"),
new XElement("author", "Me")));
doc.Add(newBook);

// What happens if two people try this at the same time?
doc.Save("Books.xml");

2- ドキュメントを Load() する場合は、特定のノードの下にエントリを追加してから、Save() をクリックします。別のユーザーがすでにそのノードの下に値を追加した場合 (Load() をヒットしたため)、さらに悪いことにノードを削除した場合はどうなりますか?

もちろん、これらの問題を回避することはできますが、回避する必要があるかどうかを教えてくれるドキュメントは見つかりませんでした。少なくとも最初のものは、確実にテストするには少し面倒です。

4

1 に答える 1

1

これは実際には LINQ to XML の問題ではなく、基本的な同時実行の問題です。

  1. 2 人が同時に [保存] をクリックし、バッキング ストアがファイルであると仮定すると、保存のためにファイルを開いた方法によっては、エラーが発生する可能性があります。(ファイル名を渡すだけで) XDocument クラスに任せると、それが排他的に開かれる可能性があり、他の誰かが同じことをしようとすると (同じコードがヒットすると仮定して) 例外が発生します。基本的に、読み取り/書き込みを行っている共有リソースへのアクセスを同期する必要があります。

  2. 別のユーザーがすでに値を追加している場合、書き込み先のリソースを取得するのに問題がないと仮定すると、変更によってリソースが上書きされます。これは、オプティミスティック コンカレンシーとして知られるデータベースで頻繁に発生する問題であり、データをロードしてから保存するまでの間に変更が発生したかどうかを示す何らかの値が必要です (ほとんどのデータベースでは、タイムスタンプ値が生成されます)。

于 2009-01-08T19:49:30.570 に答える