LINQ to XML-Updates - wie funktioniert es mehrere gleichzeitige Lese- / Schreibgeräte umgehen?

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

Frage

Ich habe ein altes System, das XML verwendet dafür die Datenspeicherung ist. Ich werde die Daten für ein anderes Mini-Projekt zu verwenden und wollte zur Abfrage / Aktualisierung der Daten LINQ to XML verwenden; aber es gibt zwei Szenarien, die ich bin mir nicht sicher, ob ich muss mich behandeln oder nicht:

1- Wenn ich etwas ähnlich den folgenden Code, und 2 Personen passieren die Save () in der gleichen Zeit schlagen? Ist LINQ to XML warten, bis die Datei wieder verfügbar ist vor dem Speichern, oder wird es nur werfen? Ich will nicht, Schlösser in setzen, es sei denn ich muss:)

// 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- Wenn ich Load () ein Dokument, fügen Sie einen Eintrag unter einem bestimmten Knoten, und dann drücken Sie Save (); was passiert, wenn ein anderer Benutzer bereits einen Wert unter diesem Knoten hinzugefügt (da ich meine Last getroffen ()) oder noch schlimmer, löschte den Knoten?

Natürlich kann ich diese Probleme umgehen, aber ich konnte keine Dokumentation finden, die mir sagen, ob ich will oder nicht haben, und der erste, der zumindest ein bisschen von einem Schwein zuverlässig zu testen wäre.

War es hilfreich?

Lösung

Es ist nicht wirklich ein LINQ to XML-Ausgabe, sondern ein grundlegendes Concurrency Problem.

  1. Unter der Annahme, die beiden Menschen schlagen Speicher zur gleichen Zeit, und die Hintergrundspeicher sind eine Datei, dann je nachdem, wie Sie die Datei zum Speichern geöffnet, könnten Sie einen Fehler. Wenn Sie es auf die XDocument Klasse verlassen (nur um in einem Dateinamen vorbei), dann sind die Chancen sie es ausschließlich öffnen, und jemand anderes versucht, das gleiche zu tun (unter der Annahme des gleichen Code trifft es) wird eine Exception. Sie haben grundsätzlich Zugriff auf jede gemeinsam genutzte Ressource zu synchronisieren, die Sie von / Schreiben zu lesen.

  2. Wenn ein anderer Benutzer bereits einen Wert hinzugefügt, dann sind Sie unter der Annahme haben kein Problem, die Ressource schreiben zu erhalten, wird Ihre Änderungen auf die Ressource zu überschreiben. Dies ist ein häufiges Problem mit Datenbanken wie Parallelität bekannt, und Sie müssen eine Art von Wert, um anzuzeigen, ob eine Änderung zwischen der Zeit, die Daten geladen aufgetreten ist, und wenn Sie es speichern (die meisten Datenbanken werden Zeitstempel-Werte für Sie generieren).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top