Actualizaciones de LINQ to XML: ¿cómo maneja múltiples lectores / escritores concurrentes?

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

Pregunta

Tengo un sistema antiguo que usa XML para el almacenamiento de datos. Voy a usar los datos para otro mini-proyecto y quería usar LINQ to XML para consultar / actualizar los datos; pero hay 2 escenarios en los que no estoy seguro de si necesito manejarme o no:

1- ¿Si tengo algo similar al siguiente código y 2 personas presionan Save () al mismo tiempo? ¿LINQ to XML espera hasta que el archivo vuelva a estar disponible antes de guardarlo o simplemente se lanzará? No quiero poner cerraduras a menos que necesite :)

// 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 cargo () un documento, agregue una entrada debajo de un nodo en particular y luego presione Guardar (); ¿Qué sucede si otro usuario ya ha agregado un valor debajo de ese nodo (desde que presioné mi Carga ()) o, peor aún, eliminó el nodo?

Obviamente puedo solucionar estos problemas, pero no pude encontrar ninguna documentación que me diga si tengo que hacerlo o no, y el primero al menos sería un poco difícil de probar de manera confiable.

¿Fue útil?

Solución

No es realmente un problema de LINQ to XML, sino un problema básico de concurrencia.

  1. Suponiendo que las dos personas están presionando Guardar al mismo tiempo, y el almacén de respaldo es un archivo, entonces, dependiendo de cómo abrió el archivo para guardar, puede recibir un error. Si lo deja a la clase XDocument (simplemente pasando un nombre de archivo), entonces es probable que lo abra exclusivamente, y alguien más que intente hacer lo mismo (suponiendo que el mismo código lo golpee) obtendrá una excepción. Básicamente, debe sincronizar el acceso a cualquier recurso compartido desde el que esté leyendo / escribiendo.

  2. Si otro usuario ya ha agregado un valor, suponiendo que no tenga problemas para obtener el recurso para escribir, sus cambios sobrescribirán el recurso. Este es un problema frecuente con las bases de datos conocidas como concurrencia optimista, y necesita algún tipo de valor para indicar si se ha producido un cambio entre el momento en que cargó los datos y cuando los guarda (la mayoría de las bases de datos generarán valores de marca de tiempo para usted).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top