從今天開始繼續這個系列。告訴大家一個好消息:微軟於2月1日發布了 Visual Studio Team System 2008 Team Suite簡體中文版,您可以在下載 Visual Studio Team System 2008 Team Suite簡體中文版90 天試用版。今天簡 單的學習下開放式並發控制和事務的內容,具體詳細的內容現在可以參看MSDN了 。
Simultaneous Changes開放式並發控制
下表介紹 LINQ to SQL 文 檔中涉及開放式並發的術語:
術語 說明 並發 兩個或更多用戶同時嘗試更新同一數據庫行 的情形。 並發沖突 兩個或更多用戶同時嘗試向一 行的一列或多列提交沖突值的情形。 並發控制 用 於解決並發沖突的技術。 開放式並發控制 先調查 其他事務是否已更改了行中的值,再允許提交更改的技術。相比之下,保守式並 發控制則是通過鎖定記錄來避免發生並發沖突。之所以稱作開放式控制,是因為 它將一個事務干擾另一事務視為不太可能發生。 沖突解決 通過重新查詢數據庫刷新出現沖突的項,然後協調差異的過程。刷新 對象時,LINQ to SQL 更改跟蹤器會保留以下數據:
最初從數據庫獲取 並用於更新檢查的值 通過後續查詢獲得的新數據庫值。
LINQ to SQL 隨 後會確定相應對象是否發生沖突(即它的一個或多個成員值是否已發生更改)。 如果此對象發生沖突,LINQ to SQL 下一步會確定它的哪些成員發生沖突。LINQ to SQL 發現的任何成員沖突都會添加到沖突列表中。
在 LINQ to SQL 對象模型中,當以下兩個條件都得到滿足時,就會發生“開 放式並發沖突”:客戶端嘗試向數據庫提交更改;數據庫中的一個或多個 更新檢查值自客戶端上次讀取它們以來已得到更新。此沖突的解決過程包括查明 對象的哪些成員發生沖突,然後決定您希望如何進行處理。
開放式並發 (Optimistic Concurrency)
說明:這個例子中在你讀取數據之前,另外一個 用戶已經修改並提交更新了這個數據,所以不會出現沖突。
//我 們打開一個新的連接來模擬另外一個用戶
NorthwindDataContext otherUser_db = new NorthwindDataContext();
var otherUser_product =
otherUser_db.Products.First(p => p.ProductID == 1);
otherUser_product.UnitPrice = 999.99M;
otherUser_db.SubmitChanges();
//我們當前連接
var product = db.Products.First(p => p.ProductID == 1);
product.UnitPrice = 777.77M;
try
{
db.SubmitChanges();//當前連接執行成 功
}
catch (ChangeConflictException)
{
}