[英]SQL Server 2008 Express locking
好的,所以我已經閱讀了很多有關SQL Server鎖定的內容,但是我正努力理解所有這些內容。
因此,我想要實現的是:
我需要能夠在用戶A SELECT時鎖定行
如果用戶B隨后嘗試選擇它,則我的winforms .net應用程序需要將相關表單上的所有控件都設置為禁用,因此用戶無法嘗試更新。 如果我可以為用戶B拋出一個消息框,說明用戶A是使用該行的人,那也很好。
因此,基本上,用戶B需要能夠選擇數據,但是當他們這樣做時,他們還應該獲得a)記錄是否被鎖定以及b)誰被鎖定。
我知道人們會說我應該讓SQL Server處理鎖定,但是我需要用戶B在選擇記錄后立即知道該記錄正在使用中,而不是找出何時更新-到那時他們可以在表格中輸入了數據,這給我帶來了不一致。
同樣,任何鎖都需要允許SELECT仍然發生-因此,當用戶B執行其SELECT時,他不僅應該獲得數據並能夠查看它,而不僅僅是拋出異常並接收不/不完整的數據,而不僅僅是能夠更新它。
我猜這是很基本的東西,但是SQL Server鎖定涉及很多術語,我不熟悉,這使得當前很難閱讀。
謝謝
要創建這種類型的“應用程序鎖定”,您可能需要使用一個名為Locks
的表,並在其中插入鍵,用戶ID和表名。
出現選擇時,請加入Locks表並使用此值的存在來表示記錄已被鎖定。
我還建議您在要保護的表中添加“ RowVersion”列。 此字段將有助於識別您是要更新還是查詢自上次選擇以來已更改的行。
這並不是SQL Server鎖定的真正目的-理想情況下,您只應保持事務(以及鎖)的打開狀態,以完成針對該數據庫的原子操作所需的絕對最低限度-您當然不應在保持鎖的同時等待用戶輸入。
通過(例如)在表中添加一個locked
位列以及一個locked_by
varchar列來跟蹤誰已鎖定行,可以更好地自己跟蹤這些類型的鎖。
第一個用戶應UPDATE
該行以指示該行已被鎖定以及被誰鎖定:
UPDATE MyTable
SET `locked` = 1
AND `locked_by` = @me
WHERE `locked` = 0
locked
= 0校驗用於防止潛在的比賽情況,並確保您不更新別人已經鎖定的記錄。
然后,第一個用戶執行SELECT
來返回數據,並確保他們確實設法鎖定了該行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.