簡體   English   中英

我可以將數據庫記錄標記為“正在使用”嗎?

[英]Can I mark a database record as “in use”?

假設我在數據庫服務器上有一個表(我們稱它為myTable ),並且我正在編寫一個桌面客戶端應用程序,該應用程序允許您修改myTable中的記錄。 我不希望兩個用戶能夠編輯相同的記錄,即,如果用戶A編輯記錄1而用戶B嘗試執行相同的操作,則他會收到通知,通知說該記錄當前已被用戶A“鎖定”。

我敢肯定這是一個普遍的問題,所以我想知道是否有規范的解決方案。


有一個明顯的解決方案,但也有一個明顯的缺點:

  • 一個字段添加inUseBymyTable ,它一旦用戶開始編輯記錄設置為用戶的姓名,清除它一旦用戶完成,如

     function editRecord(recordId): begin transaction if (select lockedBy from myTable where id = recordId) is not empty: commit show "Sorry, record already in use by ..." else update myTable set lockedBy = current_user() where id = recordId commit show UI window to let user edit and update record update myTable set lockedBy = empty where id = recordId 

    缺點:如果用戶A的應用程序崩潰,則記錄保持鎖定狀態。

乍一看,以下方法似乎合適,但無法解決問題:

  • 使用數據庫鎖來鎖定記錄1。這只會導致用戶B超時。 我需要將記錄鎖定在應用程序級別而不是數據庫級別。

一種常見的方法是使用ROWVERSION進行樂觀並發。

Rowversion是一種數據類型(您將添加為新列)在更新行時更新。

因此,選擇行,包括rowversion列。 當您發回更新時,請確保行版本匹配-通過進行更新並添加“ WHERE Rowversion = TheRowversionIGotEarlier”並查看@@ ROWCOUNT是否不為0-如果為零,則可以假定有人修改了該行自從您閱讀它以來,就可以將該消息返回給用戶。

http://www.mssqltips.com/sqlservertip/1501/optimistic-locking-in-sql-server-using-the-rowversion-data-type/

您正在詢問悲觀並發,正如這個答案和對您的問題的評論所說-請考慮樂觀並發。 考慮您的模型,它將如何處理某人開始編輯記錄然后吃午餐的問題? 或者,如果他們從午餐后再也沒有回來? 如果出於關鍵的業務原因必須同時編輯記錄怎么辦?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM