Domanda

Ho un vecchio sistema che utilizza XML per l'archiviazione dei dati. Userò i dati per un altro mini-progetto e volevo usare LINQ to XML per interrogare / aggiornare i dati; ma ci sono 2 scenari che non sono sicuro se devo gestirmi o meno:

1- Se ho qualcosa di simile al seguente codice e 2 persone accedono contemporaneamente a Save ()? LINQ to XML attende fino a quando il file non sarà nuovamente disponibile prima del salvataggio o verrà semplicemente lanciato? Non voglio mettere i blocchi a meno che non sia necessario :)

// 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- Se carico un documento (), aggiungi una voce sotto un nodo particolare, quindi premi Salva (); cosa succede se un altro utente ha già aggiunto un valore sotto quel nodo (da quando ho premuto il mio Load ()) o, peggio ancora, ho eliminato il nodo?

Ovviamente posso risolvere questi problemi, ma non sono riuscito a trovare alcuna documentazione che potesse dirmi se devo o no, e il primo almeno sarebbe un po 'un maiale da testare in modo affidabile.

È stato utile?

Soluzione

In realtà non è un problema LINQ to XML, ma un problema di concorrenza di base.

  1. Supponendo che le due persone stiano colpendo contemporaneamente Save e l'archivio di backup sia un file, quindi a seconda di come hai aperto il file per il salvataggio, potresti ricevere un errore. Se lo lasci alla classe XDocument (semplicemente passando un nome di file), allora è probabile che lo stia aprendo esclusivamente, e qualcun altro che cerca di fare lo stesso (supponendo che lo stesso codice lo colpisca) otterrà un'eccezione. Fondamentalmente devi sincronizzare l'accesso a qualsiasi risorsa condivisa da cui stai leggendo / scrivendo.

  2. Se un altro utente ha già aggiunto un valore, supponendo che tu non abbia problemi a ottenere la risorsa su cui scrivere, le tue modifiche sovrascriveranno la risorsa. Questo è un problema frequente con i database noti come concorrenza ottimistica e hai bisogno di una sorta di valore per indicare se si è verificato un cambiamento tra il momento in cui hai caricato i dati e quando li salvi (la maggior parte dei database genererà valori di data / ora per te).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top