程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET 2.0數據操作教程之二十一 實現開放式並發

ASP.NET 2.0數據操作教程之二十一 實現開放式並發

編輯:關於ASP.NET

返回“ASP.NET 2.0數據教程目錄”

導言

對於那些僅僅允許用戶查看數據,或者僅有一個用戶可以修改數 據的web應用軟件,不存在多用戶並發沖突的問題。然而對於那些允許多個用戶修 改或刪除數據的web應用軟件,則有可能發生一個用戶所做的更改與另一個並發用 戶的更改沖突。在沒有任何並發策略的地方,當兩個用戶同時編輯某一條記錄, 最後提交的用戶的更改將覆蓋先提交的用戶所作的更改。

例如,假設兩個 用戶,Jisun和Sam,都訪問我們的應用軟件中的一個頁面,這個頁面允許訪問者 通過一個GridView控件更新和刪除產品數據。他們都同時點擊GridView控件中的 Edit按鈕。Jisun把產品名稱更改為“Chai Tea”並點擊Update按鈕, 實質結果是向數據庫發送一個UPDATE語句,它將更新此產品的所有可修改的字段 (盡管Jisun實際上只修改了一個字段:ProductName)。在這一刻,數據庫中包 含有這條產品記錄“Chai Tea”—種類為Beverages、供應商為 Exotic Liquids、等該產品的詳細信息。然而,在Sam的屏幕中的GridView裡,當 前編輯行裡顯示的產片名稱依舊是“Chai”。在Jisun的更改被提交後 片刻,Sam把種類更改為“Condiments”並點擊Update按鈕。這個發送 到數據庫的UPDATE語句的結果是將產品名稱更改為“Chai”、 CategoryID字段的值是種類Beverages對應的ID,等等。Jisun所作的對產品名稱 的更改就被覆蓋了。圖1展示了這些連續的事件。

圖 1: 當兩個用戶同時更新一條記錄,則存在一個用戶的更改覆蓋另一 個的更改的可能性

類似地,當兩個用戶同時訪問一個頁面,一個用戶可能 更新的事另一個用戶已經刪除的記錄。或者,在一個用戶加載頁面跟他點擊刪除 按鈕之間的時間裡,另一個用戶修改了這條記錄的內容。

有下面三中並發 控制策略可供選擇:

Ø什麼都不做 –如果並發用戶修改的是 同一條記錄,讓最後提交的結果生效(默認的行為)

Ø開放式並發 (Optimistic Concurrency) - 假定並發沖突只是偶爾發生,絕大多數的時候並 不會出現; 那麼,當發生一個沖突時,僅僅簡單的告知用戶,他所作的更改不能 保存,因為別的用戶已經修改了同一條記錄

Ø保守式並發 (Pessimistic Concurrency) – 假定並發沖突經常發生,並且用戶不能 容忍被告知自己的修改不能保存是由於別人的並發行為;那麼,當一個用戶開始 編輯一條記錄,鎖定該記錄,從而防止其他用戶編輯或刪除該記錄,直到他完成 並提交自己的更改

注意:在本節裡,我們不討論保守式並附的例子。保守 式並發控制很少使用,因為鎖定如果沒有完全釋放,會妨礙其他用戶進行數據更 新。例如,如果一個用戶為了編輯而鎖定某一條記錄,但在解鎖之前就離開了, 那麼其他任何用戶都不能更新這條記錄,直到最初的用戶返回並完成他的更新。 因此,使用保守式並發控制的地方,相應地會作一個時間限制,如果到達這個時 間限制,則取消鎖定。例如訂票網站,當用戶完成他的訂票過程時會鎖定某個特 定的座位,這就是一個使用保守式並發控制的例子。

第一步:如何實現開 放式並發控制

開放式並發控制能夠確保一條記錄在更新或者刪除時跟它開 始這次更新或修改過程時保持一致。例如,當在一個可編輯的GridView裡點擊編 輯按鈕時,該記錄的原始值從數據庫中讀取出來並顯示在TextBox和其他Web控件 中。這些原始的值保存在GridView裡。隨後,當用戶完成他的修改並點擊更新按 鈕,這些原始值加上修改後的新值發送到業務邏輯層,然後到數據訪問層。數據 訪問層必定發出一個SQL語句,它將僅僅更新那些開始編輯時的原始值根數據庫中 的值一致的記錄。圖二描述了這些事件發生的順序。

圖2: 為了更新或刪除能夠成功,原始值必須與數據庫中相應的值一致

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved