2009-01-08 34 views
0

我有一个使用XML来存储数据的旧系统。我打算将这些数据用于另一个小型项目,并希望使用LINQ to XML来查询/更新数据;但有两种情况我不确定是否需要处理自己:LINQ to XML更新 - 它如何处理多个并发读者/作者?

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

很明显,我可以解决这些问题,但是我找不到任何可以告诉我是否需要或不需要的文档,并且第一个文档至少可以用来测试可靠性。

回答

1

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

  1. 假设两个人都打保存在同一时间,和后备存储是一个文件,那么这取决于你如何打开保存文件,你可能会得到一个错误。如果你把它留给XDocument类(只是传入一个文件名),那么它很有可能只是打开它,而其他人试图做同样的事情(假设使用相同的代码)会得到一个异常。您基本上必须同步访问您正在读取/写入的任何共享资源。

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

+0

感谢您的回复。我认为这是一个LINQ to XML问题,因为我使用LINQ的其他时间,后端数据库负责处理这些事情。我只是好奇LINQ to XML中是否有任何“魔术”。 – 2009-01-08 19:55:36