Обновления LINQ to XML - как он обрабатывает несколько одновременных программ чтения / записи? - PullRequest
0 голосов
/ 08 января 2009

У меня есть старая система, которая использует XML для хранения данных. Я собираюсь использовать данные для другого мини-проекта и хотел использовать LINQ to XML для запроса / обновления данных; но есть 2 сценария, в которых я не уверен, должен ли я справиться сам или нет:

1- Если у меня есть что-то похожее на следующий код, и два человека случайно нажали Save () одновременно? LINQ to XML ждет, пока файл снова станет доступным перед сохранением, или он просто выбросит? Я не хочу вставлять замки, если мне не нужно:)

// 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 - Если я загружаю () документ, добавляю запись под конкретным узлом, а затем нажимаю кнопку Сохранить (); что произойдет, если другой пользователь уже добавил значение под этим узлом (так как я нажал на Load ()) или, что еще хуже, удалил узел?

Очевидно, что я могу обойти эти проблемы, но я не смог найти никакой документации, которая могла бы сказать мне, должен ли я или нет, и первым, по крайней мере, было бы немного свиньи для надежного тестирования.

1 Ответ

1 голос
/ 08 января 2009

На самом деле это не проблема LINQ to XML, а основная проблема параллелизма.

  1. Если два человека одновременно нажимают кнопку Сохранить, а резервное хранилище - это файл, то в зависимости от того, как вы открыли файл для сохранения, вы можете получить сообщение об ошибке. Если вы оставите его классу XDocument (просто передавая имя файла), то, скорее всего, он откроет его исключительно, и кто-то другой, пытающийся сделать то же самое (предполагая, что код выполняет тот же удар при этом), получит исключение. В основном вам нужно синхронизировать доступ к любому общему ресурсу, с которого вы читаете / пишете.

  2. Если другой пользователь уже добавил значение, то при условии, что у вас нет проблем с получением ресурса для записи, ваши изменения перезапишут ресурс. Это частая проблема с базами данных, известной как оптимистический параллелизм, и вам нужно какое-то значение, чтобы указать, произошло ли изменение между моментом загрузки данных и его сохранением (большинство баз данных генерируют значения меток времени для вас).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...