返回“ASP.NET 2.0數據教程目錄”
導言
對於可能存在多用戶同時更新或刪除數據的web程序來說,存在一 個用戶的修改覆蓋另一個用戶的情況。當設計這樣的程序時,選擇適當的並發控 制技術非常重要。我們在實現開放式並發裡已經討論過,有三種concurrency control (並發控制)的策略:
什麼都不做—如果並發用戶修改的 是同一條記錄,讓最後提交的結果生效(默認的行為)
開放式並發 (Optimistic Concurrency) — 假定並發沖突只是偶爾發生,絕大多數的 時候並不會出現; 那麼,當發生一個沖突時,僅僅簡單的告知用戶,他所作的更 改不能保存,因為別的用戶已經修改了同一條記錄
保守式並發 (Pessimistic Concurrency )— 假定並發沖突經常發生,並且用戶不能 容忍被告知自己的修改不能保存是由於別人的並發行為;那麼,當一個用戶開始 編輯一條記錄,鎖定該記錄,從而防止其他用戶編輯或刪除該記錄,直到他完成 並提交自己的更改
目前為止我們編輯DataList 的教程都是使用的默認的 策略—也就是我們讓最後寫的結果生效。本章我們學習如何使用開放式並發 。
第一步: 理解開放式並發是如何實現的
開放式並發控制能夠確 保一條記錄在更新或者刪除時跟它開始這次更新或修改過程時保持一致。例如, 當在一個可編輯的DataList裡點擊編輯按鈕時,該記錄的原始值從數據庫中讀取 出來並顯示在TextBox和其他Web控件中。這些原始的值需要被保存下來。隨後, 當用戶完成他的修改並點擊更新按鈕,這些原始值加上修改後的新值發送到業務 邏輯層,然後到數據訪問層。數據訪問層發出一個SQL語句,它將僅僅更新那些開 始編輯時的原始值根數據庫中的值一致的記錄。圖一描述了這些事件發生的順序 。
圖1: 為了更新或刪除能夠成功,原始值必須與數據庫中相應的值一致
有多種方法可以實現開放式並發控制(查看Peter A. Bromberg的文章 Optmistic Concurrency Updating Logic,從摘要中看到許多選擇)。ADO.NET類 型化數據集提供了一種應用,這只需要在配置時勾選上一個CheckBox。開啟 TableAdapter 的開放並發需要在TableAdapter 的Update和Delete語句後面加一 個比較所有原始值的WHERE從句。我們在實現開放式並發裡創建了一個這樣的類型 化數據集(名為NorthwindOptimisticConcurrency)和一個名為 ProductsOptimisticConcurrencyBLL的BLL類。
本章我們將使用上面的方 法創建一個DataList。
注意:在繼續前請閱讀實現開放式並發 ,它提供 了關於開放並發如何工作和如何讓BLL和DAL執行開放並發的詳細信息。
第 二步:創建一個可編輯和刪除的 DataList
使用DataList執行開放並發時 ,需要我們保存原始值 —更新或刪除時的值— 然後將這些值連同新 的值一起傳到BLL。首先我們來創建一個可編輯和刪除的DataList,它列出 product,並允許修改name和price。
打開EditDeleteDataList文件夾下的 OptimisticConcurrency.aspx頁。拖一個DataList進來。並將ID設為Products。 通過它的智能標簽,創建一個名為ProductsDataSource的ObjectDataSource,並 用ProductsBLL類的GetProducts()方法配置它。在UPDATE,INSERT,DELETE標簽裡 選擇(None).
圖 2: 在UPDATE, INSERT, DELETE標簽裡選擇 (None)