首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ to SQL 開放式並發控制與交易模型:衝突偵測、解決與三種交易模式

     編輯:關於.NET

開放式並發控制核心概念

術語說明
並發多使用者同時更新同一資料列
並發衝突多使用者提交衝突值
開放式並發控制提交前檢查資料是否被他人修改,假設衝突機率低
衝突解決重新查詢、協調差異、決定保留或覆蓋

衝突發生條件:

  1. 用戶端嘗試提交異動
  2. 資料庫中更新檢查值(預設為所有欄位或標記 UpdateCheck 的欄位)自上次讀取後已變更

衝突情境示範

情境 1:讀取前他人已提交 — 無衝突

// 其他使用者先更新並提交
NorthwindDataContext other = new NorthwindDataContext();
var p = other.Products.First(x => x.ProductID == 1);
p.UnitPrice = 999.99M;
other.SubmitChanges();

// 當前使用者讀取最新值並更新
var product = db.Products.First(x => x.ProductID == 1);
product.UnitPrice = 777.77M;
db.SubmitChanges(); // 成功,無例外

情境 2:讀取後他人提交 — 觸發 ChangeConflictException

var product = db.Products.First(x => x.ProductID == 1); // 讀取
// 其他使用者更新並提交
NorthwindDataContext other = new NorthwindDataContext();
var p = other.Products.First(x => x.ProductID == 1);
p.UnitPrice = 999.99M;
other.SubmitChanges();

// 當前使用者嘗試提交
product.UnitPrice = 777.77M;
try { db.SubmitChanges(); }
catch (ChangeConflictException) { /* 發生衝突 */ }

三種交易模型

  1. 顯式本地交易:設定 db.Transaction = sqlTransaction,自行 Commit/Rollback。
  2. 顯式可分散式交易:使用 TransactionScope,LINQ to SQL 偵測到環境交易自動加入,不關閉連線。
  3. 隱式交易:未提供交易時,SubmitChanges 內部自動建立本地交易,全部成功才提交,否則回滾。

隱式交易範例

try {
    Product p1 = db.Products.First(x => x.ProductID == 4);
    Product p2 = db.Products.First(x => x.ProductID == 5);
    p1.UnitsInStock -= 3;
    p2.UnitsInStock -= 5; // 違反 CHECK 約束
    db.SubmitChanges(); // 整批回滾
} catch (SqlException e) { /* 處理 */ }

顯式 TransactionScope 範例

using (TransactionScope ts = new TransactionScope()) {
    try {
        Product p1 = db.Products.First(x => x.ProductID == 4);
        Product p2 = db.Products.First(x => x.ProductID == 5);
        p1.UnitsInStock -= 3;
        p2.UnitsInStock -= 5;
        db.SubmitChanges();
        ts.Complete();
    } catch (SqlException e) { /* 處理 */ }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved