Question

J'ai un ancien système qui utilise XML pour le stockage de ses données. Je vais utiliser les données pour un autre mini-projet et je voulais utiliser LINQ to XML pour interroger / mettre à jour les données; mais il y a 2 scénarios que je ne sais pas si j'ai besoin de me débrouiller seul ou pas:

1- Si j'ai quelque chose de similaire au code suivant, et si 2 personnes ont appuyé sur Save () en même temps? Est-ce que LINQ to XML attend que le fichier soit à nouveau disponible avant de sauvegarder, ou va-t-il simplement jeter? Je ne veux pas mettre de cadenas sauf si j'ai besoin de:)

// 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- Si je charge () un document, ajoutez une entrée sous un nœud particulier, puis cliquez sur Enregistrer (); que se passe-t-il si un autre utilisateur a déjà ajouté une valeur sous ce nœud (depuis que j'ai frappé mon Load ()) ou pire encore, a supprimé le nœud?

Évidemment, je peux contourner ces problèmes, mais je n’ai trouvé aucune documentation qui puisse me dire si je le dois ou non, et le premier au moins serait un peu un cochon à tester de manière fiable.

Était-ce utile?

La solution

Ce n'est pas vraiment un problème LINQ to XML, mais un problème de concurrence simultanée.

  1. En supposant que les deux personnes cliquent sur Enregistrer en même temps et que le magasin de sauvegarde est un fichier, vous risquez d'obtenir une erreur en fonction de la manière dont vous avez ouvert le fichier pour l'enregistrement. Si vous laissez le soin à la classe XDocument (en passant simplement un nom de fichier), il y a des chances qu'il l'ouvre exclusivement et que quelqu'un d'autre essayant de faire la même chose (en supposant que le même code le frappe) obtiendra une exception. Vous devez fondamentalement synchroniser l'accès à toute ressource partagée que vous lisez / écrivez.

  2. Si un autre utilisateur a déjà ajouté une valeur, en supposant que vous ne rencontriez pas de problème pour obtenir la ressource sur laquelle écrire, vos modifications écraseront la ressource. Il s'agit d'un problème fréquent avec les bases de données connues sous le nom de concurrence simultanée optimiste, et vous avez besoin d'une sorte de valeur pour indiquer si un changement s'est produit entre le moment où vous avez chargé les données et celui que vous enregistrez (la plupart des bases de données génèrent des valeurs d'horodatage pour vous).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top