LINQ之開放式併發控制和事務

2021-08-25 07:01:11 字數 2343 閱讀 7018

今天簡單的學習下開放式併發控制和事務的內容,具體詳細的內容現在可以參看msdn了。

下表介紹 linq to sql 文件中涉及開放式併發的術語:

術語 說明

併發 兩個或更多使用者同時嘗試更新同一資料庫行的情形。

併發衝突

兩個或更多使用者同時嘗試向一行的一列或多列提交衝突值的情形。

併發控制

用於解決併發衝突的技術。

開放式併發控制

先調查其他事務是否已更改了行中的值,再允許提交更改的技術。相比之下,保守式併發控制則是通過鎖定記錄來避免發生併發衝突。之所以稱作開放式控制,是因為它將乙個事務干擾另一事務視為不太可能發生。

衝突解決

通過重新查詢資料庫重新整理出現衝突的項,然後協調差異的過程。重新整理物件時,linq to sql 更改***會保留以下資料:

最初從資料庫獲取並用於更新檢查的值 通過後續查詢獲得的新資料庫值。

linq to sql 隨後會確定相應物件是否發生衝突(即它的乙個或多個成員值是否已發生更改)。如果此物件發生衝突,linq to sql 下一步會確定它的哪些成員發生衝突。linq to sql 發現的任何成員衝突都會新增到衝突列表中。

在 linq to sql 物件模型中,當以下兩個條件都得到滿足時,就會發生「開放式併發衝突」:客戶端嘗試向資料庫提交更改;資料庫中的乙個或多個更新檢查值自客戶端上次讀取它們以來已得到更新。 此衝突的解決過程包括查明物件的哪些成員發生衝突,然後決定您希望如何進行處理。

說明:這個例子中在你讀取資料之前,另外乙個使用者已經修改並提交更新了這個資料,所以不會出現衝突。

//我們開啟乙個新的連線來模擬另外乙個使用者

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;

trycatch (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;

trycatch (changeconflictexception)

linq to sql 支援三種事務模型,分別是:

說明:這個例子在執行submitchanges()操作時,隱式地使用了事務。因為在更新2種產品的庫存數量時,第二個產品庫存數量為負數了,違反了伺服器上的 check 約束。這導致了更新產品全部失敗了,系統回滾到這個操作的初始狀態。

try

catch (system.data.sqlclient.sqlexception e)

說明:這個例子使用顯式事務。通過在事務中加入對資料的讀取以防止出現開放式併發異常,顯式事務可以提供更多的保護。如同上乙個查詢中,更新 prod2 的 unitsinstock 欄位將使該字段為負值,而這違反了資料庫中的 check 約束。這導致更新這兩個產品的事務失敗,此時將回滾所有更改。

using (transactionscope ts = new 

transactionscope())

catch (system.data.sqlclient.sqlexception e)

}

摘自:

LINQ之開放式併發控制和事務

今天簡單的學習下開放式併發控制和事務的內容,具體詳細的內容現在可以參看msdn了。下表介紹 linq to sql 文件中涉及開放式併發的術語 術語 說明 併發 兩個或更多使用者同時嘗試更新同一資料庫行的情形。併發衝突 兩個或更多使用者同時嘗試向一行的一列或多列提交衝突值的情形。併發控制 用於解決併...

開放式併發ASP內建方法

oldvaluesparameterformatstring oldvaluesparameterformatstring 屬性的值必須對映到 bll裡接收原始值的輸入引數的名稱。因為我們把這些引數命名為 original productname original supplierid 等等,我們可...

分布式事務和事務併發控制

近期阿里開源了fescar分布式事務中介軟體,值得期待.分布式事務是指乙個事務會涉及到到多個應用介面呼叫,底層資料表涉及到多個,但資料庫可以是乙個或多個,它是傳統單資料庫事務在廣度上的延伸.事務併發控制,在oltp關係型資料庫中,事務併發控制往往是指事務的隔離性,在本文中,指的是應用層的併發事務控制...