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

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

Вопрос

У меня есть старая система, которая использует 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 ()) или, что еще хуже, удалил узел?

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

Это было полезно?

Решение

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

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

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

  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top