LINQ to XML更新-複数の同時リーダー/ライターをどのように処理しますか?

StackOverflow https://stackoverflow.com/questions/425362

質問

データストレージに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()にヒットしたため)、さらに悪い場合はノードを削除した場合はどうなりますか?

明らかにこれらの問題を回避することはできますが、私はそうする必要があるかどうかを教えてくれる文書を見つけることができませんでした。

役に立ちましたか?

解決

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top