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

ASP.NET 2.0 資料教程 50:SqlDataSource 開放式並發實作

     編輯:關於ASP.NET

開放式並發可防止多使用者同時編輯導致資料遺失。本教程示範在 SqlDataSource 中啟用此功能。

問題情境

使用者 A、B 同時編輯同一筆產品。A 修改名稱並更新,B 修改分類並更新。若無並發控制,B 的更新會覆蓋 A 的名稱變更。

啟用方式:設定 SqlDataSource

  1. 在「設定資料來源精靈」點選「進階」。
  2. 勾選「產生 INSERT、UPDATE、DELETE 陳述式」與「使用開放式並發」。
  3. 完成精靈,SqlDataSource 會自動在 UPDATE/DELETE 陳述式的 WHERE 子句加入所有原始欄位比對。

產生的 SQL 範例

UPDATE Products 
SET ProductName = @ProductName, UnitPrice = @UnitPrice
WHERE ProductID = @original_ProductID
  AND ProductName = @original_ProductName
  AND UnitPrice = @original_UnitPrice
  AND ... (所有其他欄位)

若資料庫中任一欄位已被他人修改,WHERE 條件不符,更新影響 0 列,SqlDataSource 會拋出 DBConcurrencyException。

前端處理並發衝突

<asp:GridView ID="GridView1" DataSourceID="SqlDataSource1"
    OnRowUpdated="GridView1_RowUpdated" ... />

protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
    if (e.Exception != null && e.Exception is DBConcurrencyException)
    {
        e.ExceptionHandled = true;
        lblError.Text = "資料已被其他人修改,請重新整理後再試。";
        e.KeepInEditMode = true; // 保持編輯模式
    }
}

注意事項

  • 需在資料表有 Timestamp/RowVersion 欄位時,效能最佳 (僅比對單一欄位)。
  • 無 Timestamp 時,比對所有欄位會增加網路傳輸與 WHERE 條件長度。
  • 適用於低衝突情境;高衝突建議改用悲觀鎖定或業務層版本號。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved