2011-07-21 126 views
1

我有一個系統,我想在用戶嘗試編輯當前編輯的記錄時向用戶顯示警告。如果是這種情況,用戶將無法保存記錄,只能查看記錄。多用戶編輯

我有一個想法,使用某種類來監視記錄的活動已編輯等,但這個接縫有點過分殺。 我的另一個問題是,如果瀏覽器崩潰或關閉他們的計算機如何影響頁面的狀態將會怎樣。

另一個想法是使用上次更新的時間戳,但這也看起來不行,因爲方式記錄已更新。

有沒有人有任何想法或資源,我可以如何實現這樣的事情。沒有代碼是必要的。

根據意見我添加了這些額外的細節。 數據庫是SQL服務器2008 asp.net 3.5 一條記錄可能是數據庫的很多部分,例如預訂表會話表和斷續表中的一行。

用戶將查看需要預訂的會議列表,選擇預訂並填寫預訂表單進行預訂。想要停止的是別人試圖同時進行相同的預訂,或者在別人正在進行預訂的情況下。

+0

我會推薦用'ASP.NET'替換'.NET'標籤(或C#/ VB.NET之一)。看看MSDN [樂觀/悲觀併發ADO.NET](http://msdn.microsoft.com/en-us/library/aa0416cz.aspx)。 –

+0

你使用的是什麼架構和技術? APS.NET +數據庫? WPF +數據庫?沒有數據庫?請更好地解釋。實際上什麼是「記錄」。 ? – Tigran

+0

感謝您的鏈接將有一個閱讀 –

回答

2

Esentially我保持Edit (查找)表包含4個字段UserID, Action, EntityID and Datestamp並將其鏈接到每個關聯頁面和可編輯項目。

因此,例如,如果用戶在編輯富網頁並點擊edit鏈接,該程序將執行Edit表中查找,如果沒有其他人編輯記錄不會插入,即:4, 'Edit Foo', 123, GETUTCDATE()其中123是正在編輯的Foo的ID。

該過程還有許多其他功能,例如,如果用戶處於編輯模式一段時間,記錄將從表中自動刪除,並且該項目可再次編輯。

但是,該解決方案對於我們在高使用環境中工作得非常好。我希望你明白這個主意。

0

看看optimistic/pessimistic concurrency in ADO.NET的MSDN。

悲觀併發涉及從在其影響 當前用戶的方式修改數據鎖定在數據源行 防止其他用戶。在悲觀模型中,當用戶執行導致鎖應用的動作 時,其他用戶不能執行動作 ,該動作將與鎖發生衝突,直到鎖擁有者釋放鎖。 此模型主要用於存在重大數據爭用的環境中,因此,如果發生併發衝突,使用鎖保護數據的成本爲 ,小於回滾事務的成本。

相比之下,使用樂觀併發性的用戶在讀取它時不鎖定行 。當用戶想要更新一行時,應用程序 必須確定是否其他用戶已更改該行,因爲它是 已讀。樂觀併發通常用於數據競爭較少的環境。樂觀併發性提高了性能 ,因爲不需要鎖定記錄,並且鎖定記錄 需要額外的服務器資源。另外,爲了維護 記錄鎖,與數據庫服務器的持續連接是 必需的。因爲在樂觀併發 模型中情況並非如此,與服務器的連接可以在更短的時間內免費服務更多數量的客戶端。

在樂觀併發模型,違反了被認爲具有 發生如果用戶從數據庫接收一個值後,另一個 用戶修改值的第一個用戶試圖修改 之前。

測試開放式併發衝突 有幾種技術用於測試的樂觀併發 衝突。一個涉及在表中包含一個時間戳列。 數據庫通常提供時間戳功能,可用於識別上次更新記錄的日期和時間。使用 這種技術,時間戳列包含在表 定義中。每當記錄更新時,時間戳記將更新爲 以反映當前的日期和時間。在針對樂觀的 併發衝突測試中,返回時間戳列,並且該表的內容的任何 查詢。當嘗試更新時,數據庫中的 時間戳值將與修改行中包含的原始時間戳 值進行比較。如果它們匹配,則執行更新 並將時間戳列更新爲當前時間爲 反映更新。如果它們不匹配,則發生樂觀併發衝突 。

用於測試開放式併發衝突 另一種技術是驗證所有連續的原始列的值仍然匹配 那些在數據庫中找到.....