我有一个旧系统,它使用XML进行数据存储。我将把这些数据用于另一个迷你项目,并希望使用LINQ to XML来查询/更新数据;但有2种情况我不确定自己是否需要处理自己:

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-如果我加载()文档,在特定节点下添加一个条目,然后点击Save();如果另一个用户已经在该节点下添加了一个值(因为我点击了我的Load())或更糟糕的是,删除了节点会发生什么?

显然我可以解决这些问题,但我找不到任何可以告诉我是否必须的文件,而且第一个至少可能是一个可靠的测试猪。

有帮助吗?

解决方案

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top