LINQ TO SQL分布式事務
在向大家詳細介紹LINQ TO SQL分布式事務之前,首先讓大家了解下隱式事務和顯式事務,然后全面介紹LINQ TO SQL分布式事務。
LINQ TO SQL,顧名思義,涉及到了數據庫操作。那么就會有一個事務的概念,例如,假設我們需要一次性插入兩個實體,但希望保證這兩個操作的完整性的話。
1. 隱式事務
其實,即便我們不寫代碼,LINQ TO SQL也會自動創建一個事務的。默認事務隔離級別為ReadCommitted
2. 顯式事務
我們也可以自己寫代碼,來明確地控制事務,默認事務隔離級別為ReadCommitted
3. LINQ TO SQL分布式事務
我們也可以使用TransactionScope對象,來定義LINQ TO SQL分布式事務。
注意:TransactionScope的默認隔離級別為可串行化,可能帶來并發鎖沖突問題。
***大概要談一下并發控制的問題:這個問題的出現就在于,某些時候,某個客戶端讀取到了數據,然后它斷開了,在本地修改;同時,另外一個客戶端也讀取到了數據,并且修改并提交了。此時,***個客戶端如果再進行更新,就應該是有所問題的。這就是所謂的并發問題。
LINQ TO SQL通過在submitchanges方法的時候指定ConflictMode來定義并發控制行為:
◆FailOnFirstConflict(默認的)
◆ContinueOnConflict
下面有一個例子,講解了并發沖突時繼續操作,并且對沖突項進行解決
- var query = from p in ctx.Products where p.CategoryID == 1 select p;
- foreach (var p in query)
- p.UnitsInStock = Convert.ToInt16(p.UnitsInStock - 1);
- try
- {
- ctx.SubmitChanges(ConflictMode.ContinueOnConflict);
- }
- catch (ChangeConflictException)
- {
- foreach (ObjectChangeConflict cc in ctx.ChangeConflicts)
- {
- Product p = (Product)cc.Object;
- Reponse.Write(p.ProductID + "
- ");
- cc.Resolve(RefreshMode.OverwriteCurrentValues);
- // 放棄當前更新,所有更新以原先更新為準
- }
- }
【編輯推薦】