LINQ to SQL語句(13)之開放式并發控制和事務

作者: 李永京  來源: 博客園  發布時間: 2008-09-18 16:40  閱讀: 9053 次  推薦: 0   原文鏈接   [收藏]  
 
摘要:這個系列的第十三篇,講解開放式并發控制和事務
[1] 開放式并發控制講解
[2] 事務講解

系列文章導航:

LINQ to SQL語句(1)之Where

LINQ to SQL語句(2)之Select/Distinct

LINQ to SQL語句(3)之Count/Sum/Min/Max/Avg

LINQ to SQL語句(4)之Join

LINQ to SQL語句(5)之Order By

LINQ to SQL語句(6)之Group By/Having

LINQ to SQL語句(7)之Exists/In/Any/All/Contains

LINQ to SQL語句(8)之Concat/Union/Intersect/Except

LINQ to SQL語句(9)之Top/Bottom和Paging和SqlMethods

LINQ to SQL語句(10)之Insert

LINQ to SQL語句(11)之Update

LINQ to SQL語句(12)之Delete和使用Attach

LINQ to SQL語句(13)之開放式并發控制和事務

LINQ to SQL語句(14)之Null語義和DateTime

LINQ to SQL語句(15)之String

LINQ to SQL語句(16)之對象標識

LINQ to SQL語句(17)之對象加載

LINQ to SQL語句(18)之運算符轉換

LINQ to SQL語句(19)之ADO.NET與LINQ to SQL

LINQ to SQL語句(20)之存儲過程

LINQ to SQL語句(21)之用戶定義函數

LINQ to SQL語句(22)之DataContext

LINQ to SQL語句(23)之動態查詢

LINQ to SQL語句(24)之視圖

LINQ to SQL語句(25)之繼承

LINQ簡介

adsfsaf

 

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)
{
}

說明:我們讀取數據之后,另外一個用戶獲取并提交更新了這個數據,這時,我們更新這個數據時,引起了一個并發沖突。系統發生回滾,允許你可以從數據庫檢索新更新的數據,并決定如何繼續進行您自己的更新。

//當前用戶
var product = db.Products.First(p => p.ProductID == 1);
//我們打開一個新的連接來模擬另外一個用戶
NorthwindDataContext otherUser_db = new NorthwindDataContext() ;
var otherUser_product = 
    otherUser_db.Products.First(p => p.ProductID == 1);
otherUser_product.UnitPrice = 999.99M;
otherUser_db.SubmitChanges();
//當前用戶修改
product.UnitPrice = 777.77M;
try
{
    db.SubmitChanges();
}
catch (ChangeConflictException)
{
    //發生異常!
}
[第1頁][第2頁]
0
0
 
標簽:LINQ LINQ to SQL
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()