對於可能有多用戶同時更新或刪除數據的 Web 應用程式,存在用戶修改覆蓋他人修改的風險。設計時選擇適當的並發控制策略至關重要。在 實現開放式並發 中已討論三種策略:
迄今教程皆採用預設策略(最後寫入者勝出)。本章將學習實作開放式並發。
開放式並發確保記錄在更新或刪除時,與開始編輯時的狀態一致。例如:用戶點擊 DataList 編輯按鈕時,記錄原始值從資料庫讀取並顯示於 TextBox 等控制項。這些原始值需被保存。隨後用戶完成修改點擊更新,原始值與新值一併送至 BLL、DAL。DAL 發出 SQL 陳述式,僅更新資料庫中值仍與原始值一致的記錄。圖 1 描述此事件序列。

圖 1:為了更新或刪除能夠成功,原始值必須與資料庫中相應的值一致
實現開放式並發有多種方法(參考 Peter A. Bromberg 文章 Optmistic Concurrency Updating Logic)。ADO.NET 型別化 DataSet 提供勾選核取方塊即可啟用的方案:在 TableAdapter 的 Update 與 Delete 陳述式後附加比較所有原始值的 WHERE 子句。我們在 實現開放式並發 中已建立 NorthwindOptimisticConcurrency 型別化 DataSet 與 ProductsOptimisticConcurrencyBLL 類別。
注意: 繼續前請閱讀 實現開放式並發,了解開放式並發運作細節與 BLL/DAL 實作方式。
使用 DataList 實作開放式並發需保存原始值(更新/刪除時的值),並連同新值傳至 BLL。首先建立可編輯、可刪除的 DataList,列出產品並允許修改名稱與價格。
開啟 EditDeleteDataList 資料夾下的 OptimisticConcurrency.aspx,拖曳 DataList 並設 ID 為 Products。透過智慧標籤建立名為 ProductsDataSource 的 ObjectDataSource,以 ProductsBLL 類別的 GetProducts() 方法設定。在 UPDATE、INSERT、DELETE 標籤中選擇 (None)。

圖 2:在 UPDATE、INSERT、DELETE 標籤裡選擇 (None)