LinQ to SQL 併發與事務 3

2021-04-29 13:58:05 字數 1966 閱讀 3390

最後,我們把提交語句修改為:

ctx.submitchanges(conflictmode.failonfirstconflict);

表示第一次發生衝突的時候就不再繼續了,然後並且去除最後的ctx.submitchanges();語句。來測試一下,在執行了sql後再繼續程式可以發現介面上只輸出了數字1,說明在第一條記錄失敗後,後續的併發衝突就不再處理了。

事務處理

linq to sql在提交更新的時候缺省會建立事務,一部分修改發生錯誤的話其它修改也不會生效:

ctx.customers.add(

newcustomer );

ctx.customers.add(

newcustomer );

ctx.submitchanges();

假設資料庫中已經存在顧客id為「abcde」的記錄,那麼第二次插入操作失敗將會導致第一次的插入操作失效。執行程式後會得到乙個異常,查詢資料庫發現「abcdf」這個顧客也沒有插入到資料庫中。

如果每次更新後直接提交修改,那麼我們可以使用下面的方式做事務:

if(ctx.connection

!=null

) ctx.connection.open();

dbtransaction tran

=ctx.connection.begintransaction();

ctx.transaction

=tran;

try);

createcustomer(

newcustomer );

tran.commit();

}catch

private

void

createcustomer(customer c)

執行程式後發現增加顧客abcdf的操作並沒有成功。或者,我們還可以通過transactionscope實現事務:

using

(transactionscope scope

=new

transactionscope())

);createcustomer(

newcustomer );

scope.complete();

}

事務是乙個原子的工作單位,必須完整的完成單位裡的所有工作,要麼全部執行,要麼全部都不執行。如果提交事務,則事務執行成功;如果回滾事務,則事務執行失敗。 事務具備4個基本特性--acid(原子性、一致性、孤立性和永續性)。

在linq to sql中,有三種方法建立事務:

1. 如果沒有指定任何事務,那麼當呼叫submitchanges方法時,datacontext會預設建立乙個事務。

2. 使用transactionscope建立輕量級事務

3. 給datacontext的transaction屬性指定事務

下面我用**分別來說明這幾種建立事務的方法,以northwind資料庫為例,先來看看直接使用submitchanges:

northwinddatacontext ctx 

=new northwinddatacontext();

customer c1

=new customer ;

customer c2 = new customer ; ctx.customers.

add(c1);

ctx.customers.

add(c2); ctx.submitchanges();

上面這段**中,先建立了兩個customer物件然後新增到datacontext裡面,其中的c2的customerid賦值為"testbc",長 度為六個字元,而資料庫中該字段約束為5個字元長度,這樣在submitchanges的時候應該會有異常丟擲。果然在執行的時候丟擲了 sqlexception,提示字元將被截斷。

LinQ to SQL 併發與事務 1

首先使用下面的sql語句查詢資料庫的產品表 select from products where categoryid 1 查詢結果如下圖 為了看起來清晰,我已經事先把所有分類為1產品的 和庫存修改為相同值了。然後執行下面的程式 var query from p in ctx.products wh...

Linq to sql 檢測併發

首先使用下面的 sql 語句查詢資料庫的產品表 select from products where categoryid 1 為了看起來清晰,我已經事先把所有分類為 1 產品的 和庫存修改為相同值了。然 後執行下面的程式 varquery from p in ctx.products where ...

LINQ TO SQL 併發控制

column特性的updatacheck用於設定併發衝突處理方式 always 使用使用這個列進行衝突檢測 never 從不使用這個列進行衝突檢測 whenchanged 僅在成員被應用程式更改時使用這個列檢測 這裡的檢測指傳送的sql中的where中的條件,如userinfo表中name列進行衝突...