我已經開發了一個應用程序與c#的窗體顯示一個員工在列表視圖控件的一些細節。當用戶點擊一行時,另一個表單將打開並顯示更詳細的員工記錄。Sql服務器行鎖
我希望它能夠工作,以便用戶可以看到更詳細地顯示員工記錄的表單,該記錄將被鎖定,以致另一個用戶將無法看到該記錄,直到原始記錄用戶關閉詳細信息表單。請指導我如何使用SQL Server鎖設計這種類型的應用程序。
我已經開發了一個應用程序與c#的窗體顯示一個員工在列表視圖控件的一些細節。當用戶點擊一行時,另一個表單將打開並顯示更詳細的員工記錄。Sql服務器行鎖
我希望它能夠工作,以便用戶可以看到更詳細地顯示員工記錄的表單,該記錄將被鎖定,以致另一個用戶將無法看到該記錄,直到原始記錄用戶關閉詳細信息表單。請指導我如何使用SQL Server鎖設計這種類型的應用程序。
對於行鎖,你可以使用:
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
但請記住,這不是實行正確的方法。
someTable
且沒有with (readpast)
語句的查詢都需要等待。只讓用戶'查看'只在編輯行。在ASP.NET緩存編輯行:
Application[string.Format("{0}.{1}", tableName, primaryKey)] = true;
您可以選擇'with(updlock)'來鎖定讀取的行。只要確保你只讀一行。是的,這對於併發而言是可怕的。 – Donnie 2010-12-14 17:56:44
優選的方法是...
你可以timestamp列添加到表,並把它比作傳入更新。
如果用戶試圖更新數據和時間標記不同的是,提醒用戶該數據已更改並刷新屏幕。
非首選的方法是...
添加userEditing列表,並將其設置爲誰正在與該行(如檢出)的用戶。從沒有「檢出」的任何用戶中隱藏此行,並在完成後將其釋放。
這可以成爲在很多方面問題的,你(喬用戶鎖定一行,今天是出來,簡現在需要的話),但可以在某些情況下,適當的解決方案。
+1首選方式:) – 2011-10-18 20:21:36
我建議,一旦他們打算編輯的行僅獲取了鎖。對於所有的時間記錄只看着收購鎖將影響你的數據庫性能。如果它被鎖定,他們是否真的有必要看到記錄?如果它被鎖定,他們不能編輯它。 – kevpie 2010-12-14 14:04:28