最後,我們把提交語句修改為:
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列進行衝突...