LINQ to SQL 內建開放式並發控制,透過時間戳或欄位比較偵測衝突,提供彈性解決機制。
| 術語 | 說明 |
|---|---|
| 並發 | 多用戶同時更新同一資料列 |
| 並發衝突 | 提交值相互衝突 |
| 開放式並發控制 | 提交前檢查資料是否被他人修改,不鎖定資源 |
| 衝突解決 | 重新查詢刷新,協調差異 |
SubmitChanges()// 模擬另一用戶先更新
var otherDb = new NorthwindDataContext();
var otherProduct = otherDb.Products.First(p => p.ProductID == 1);
otherProduct.UnitPrice = 999.99M;
otherDb.SubmitChanges();
// 當前用戶嘗試更新
var product = db.Products.First(p => p.ProductID == 1);
product.UnitPrice = 777.77M;
try {
db.SubmitChanges(); // 拋出 ChangeConflictException
}
catch (ChangeConflictException) {
// 處理衝突
}
// 1. 保留資料庫值(捨棄本地變更)
db.ChangeConflicts.ResolveAll(RefreshMode.OverwriteCurrentValues);
// 2. 保留本地值(強制覆蓋)
db.ChangeConflicts.ResolveAll(RefreshMode.KeepCurrentValues);
// 3. 合併(僅衝突欄位保留資料庫值,非衝突欄位保留本地值)
db.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges);
在欄位屬性加入 [Column(IsVersion=true)] 使用 TimeStamp,或 [Column(UpdateCheck=UpdateCheck.WhenChanged)] 指定檢查模式。