0

我有一个使用 XML 进行数据存储的旧系统。我打算将数据用于另一个小型项目,并希望使用 LINQ to XML 来查询/更新数据;但是有两种情况我不确定我是否需要自己处理:

1-如果我有类似于以下代码的内容,并且有 2 个人碰巧同时点击了 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()),或者更糟糕的是,删除了该节点,会发生什么?

显然我可以解决这些问题,但是我找不到任何可以告诉我是否必须这样做的文档,而且第一个文档至少对于可靠地测试来说有点麻烦。

4

1 回答 1

1

这不是真正的 LINQ to XML 问题,而是基本的并发问题。

  1. 假设两个人同时点击保存,并且后备存储是一个文件,那么根据您打开文件进行保存的方式,您可能会收到错误消息。如果您将它留给 XDocument 类(仅通过传入一个文件名),那么它很可能会以独占方式打开它,而其他人试图做同样的事情(假设相同的代码命中它)将得到一个异常。您基本上必须同步对您正在读取/写入的任何共享资源的访问。

  2. 如果另一个用户已经添加了一个值,那么假设您在获取要写入的资源时没有问题,您的更改将覆盖该资源。这是被称为乐观并发的数据库的常见问题,您需要某种值来指示在加载数据和保存数据之间是否发生了更改(大多数数据库会为您生成时间戳值)。

于 2009-01-08T19:49:30.570 回答