2009-01-08 33 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