LINQ para atualizações XML - como é que lidar com múltiplas simultâneas leitores / escritores?

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

Pergunta

Eu tenho um sistema antigo que usa XML para ele de armazenamento de dados. Eu vou estar usando os dados para um outro mini-projeto e queria usar LINQ to XML para consultar / atualizar os dados; mas há 2 cenários que eu não tenho certeza se eu preciso me cuidar ou não:

1- Se eu tenho algo parecido com o seguinte código, e 2 pessoas acontecer para acertar o Save (), ao mesmo tempo? LINQ para esperar XML até que o arquivo está disponível novamente antes de salvar, ou vai apenas jogar? Eu não quero colocar fechaduras em menos que eu preciso:)

// 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 eu Load () um documento, adicione uma entrada sob um nó particular, e depois bateu Save (); o que acontece se outro usuário já tiver adicionado um valor abaixo desse nó (desde que eu bati minha Load ()) ou ainda pior, eliminado o nó?

Obviamente, eu posso resolver estas questões, mas eu não poderia encontrar qualquer documentação que poderia me dizer se eu tenho ou não, e o primeiro, pelo menos, seria um pouco de um porco para teste confiável.

Foi útil?

Solução

Não é realmente um LINQ to XML questão, mas uma questão básica de concorrência.

  1. Assumindo que as duas pessoas estão batendo Salvar, ao mesmo tempo, e o armazenamento de backup é um arquivo, em seguida, dependendo de como você abriu o arquivo para salvar, você pode obter um erro. Se você deixá-lo para a classe XDocument (por apenas passando em um nome de arquivo), então as chances são de que está abrindo-lo exclusivamente, e alguém tentando fazer o mesmo (assumindo que o mesmo código de batê-lo) irá receber uma exceção. Você tem basicamente ao acesso sincronizar a qualquer recurso compartilhado que você está lendo a partir de / escrita a.

  2. Se outro usuário já tiver adicionado um valor, em seguida, supondo que você não tem um problema obter o recurso para gravar, as alterações substituirá o recurso. Este é um problema frequente com bases de dados conhecidas como simultaneidade otimista, e você precisa de algum tipo de valor para indicar se a mudança ocorreu entre o momento em que colocou os dados, e quando você salvá-lo (a maioria dos bancos de dados irá gerar timestamp valores para você).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top