2011-10-24 30 views
1

我有一個asp溶液內螺栓多個Silverlight應用程序,多個用戶可以是使用在同一組數據的相同應用在任何一個時間。 Silverlight應用程序的設計使它們可以從數據庫中提取數據,在本地處理數據,並在用戶對其修改感到滿意後將其寫回。但是,這個問題是,如果兩個用戶在同一個數據庫上使用相同的應用程序,他們將會覆蓋其他人的更改。鎖定表的SQL Server

在任何時候都不會有大量的用戶使用相同的數據庫,因爲有大量數據庫,並且不止一個用戶應該在任何一個數據庫上處理同一組數據時間。我的想法是爲單個用戶鎖定每個表,以獨佔訪問讀取/寫入服務器,拒絕任何其他用戶訪問甚至從相關鎖定表中讀取數據。

我怎麼會去申請表鎖,並釋放他們?我知道這可以在每個聲明的基礎上完成,但我需要用戶對這些數據擁有完全獨佔的權利。我可以預見的一個問題是釋放鎖,需要某種超時,所以表不會永久鎖定一個用戶。

回答

6

我甚至不會開始嘗試這種方式,因爲您將有超過1個用戶的可怕併發問題 - 包括使用多個窗口的1個用戶,或系統崩潰後返回等。

一種簡單的方式來處理,這將是有一個時間戳或更換計數,如果時間戳或更換計數已經改變,獲得數據,然後提醒他們要在寫別人的作品的用戶。從這個出發點,你可以走的更遠,讓他們挑選的變化,手動從其他人的變化複製,比較變化等

1

IMO鎖定數據庫構件(物理上使用SQL鎖)或邏輯上(使用您自己的鎖定表)可能會產生問題 - 它限制了您的應用程序的可伸縮性,並且可能會導致用戶在同事外出喝咖啡時感到沮喪。您的應用程序還需要進行設計,以便用戶「簽出」一個項目來指示意圖,並因此創建鎖定(而不是僅僅瀏覽您不想鎖定的數據)

作爲替代方案, Multiversion concurrency control的模式。 一種常用的非侵入式方法是爲記錄實體添加一個時間戳,並且每次在您編寫更新之前,再次獲取記錄並比較時間戳以查看是否有其他用戶在臨時過程中進行了更改。

0

林不知道的「東西」,你在你的數據庫工作是什麼,但我有我在我的應用程序進行處理,而不是使用上表等

基本上我有各種文件(如訂單或收據),它可以打開,然後編輯並保存鎖類似的問題。我所做的實現對這些鎖的鎖定是使用Type,DocID,UserID,LockedTime。 DocID和Type上的主鍵(type表示你要鎖定的東西的類型,所以這允許你在多個表格上使用這種方法等)

然後,當用戶試圖打開文檔時,我會首先運行SP檢查文檔是否被鎖定到另一個用戶,然後如果不允許打開,如果鎖定,我實現了只讀模式。當用戶保存更改時,它將解鎖文檔,以便其他人再次訪問。

林不知道,如果這方法是使用任何給你的,但它是非常簡單和快速的實施,因爲它不要求對現有的表複雜的變化。