2010-12-14 86 views
0

我已經開發了一個應用程序與c#的窗體顯示一個員工在列表視圖控件的一些細節。當用戶點擊一行時,另一個表單將打開並顯示更詳細的員工記錄。Sql服務器行鎖

我希望它能夠工作,以便用戶可以看到更詳細地顯示員工記錄的表單,該記錄將被鎖定,以致另一個用戶將無法看到該記錄,直到原始記錄用戶關閉詳細信息表單。請指導我如何使用SQL Server鎖設計這種類型的應用程序。

+4

我建議,一旦他們打算編輯的行僅獲取了鎖。對於所有的時間記錄只看着收購鎖將影響你的數據庫性能。如果它被鎖定,他們是否真的有必要看到記錄?如果它被鎖定,他們不能編輯它。 – kevpie 2010-12-14 14:04:28

回答

0

對於行鎖,你可以使用:

BEGIN TRANSACTION 
UPDATE someTable set SomeThing = 'new value' where someID = 1 
-- this will lock 'someTable' in affected row as long as transaction alive. 

-- in another connection 
select * from someTable with (readpast) 
-- this will skip locked rows 

但請記住,這不是實行正確的方法。

  • 用戶可能會因爲丟失數據而感到恐慌和責備系統,甚至會說這是一個錯誤。
  • 當您鎖定一行時,請記住它將鎖定,直到連接/事務超時或用戶提交該行爲止。
  • 沒有連接池。
  • 由於遠程連接,對於web應用程序來說是個壞主意。
  • 任何涉及someTable且沒有with (readpast)語句的查詢都需要等待。

只讓用戶'查看'只在編輯行。在ASP.NET緩存編輯行:

Application[string.Format("{0}.{1}", tableName, primaryKey)] = true; 
+0

您可以選擇'with(updlock)'來鎖定讀取的行。只要確保你只讀一行。是的,這對於併發而言是可怕的。 – Donnie 2010-12-14 17:56:44

2

優選的方法是...

你可以timestamp列添加到表,並把它比作傳入更新。

如果用戶試圖更新數據和時間標記不同的是,提醒用戶該數據已更改並刷新屏幕。

非首選的方法是...

添加userEditing列表,並將其設置爲誰正在與該行(如檢出)的用戶。從沒有「檢出」的任何用戶中隱藏此行,並在完成後將其釋放。

這可以成爲在很多方面問題的,你(喬用戶鎖定一行,今天是出來,簡現在需要的話),但可以在某些情況下,適當的解決方案。

+0

+1首選方式:) – 2011-10-18 20:21:36