2009-03-06 71 views
5

我希望有人在asp.net應用程序中實現類似「悲觀鎖定」的經驗。這是我在尋找的行爲:如何在asp.net應用程序中實現「悲觀鎖定」?

  1. 用戶A打開訂單#313
  2. 用戶B試圖打開訂單#313,但被告知,用戶A已經有順序X分鐘以獨佔方式打開。

因爲我以前沒有實現這個功能,我有幾個設計問題:

  • 我應該重視的訂單記錄哪些數據?我在考慮:
    • LockOwnedBy
    • LockAcquiredTime
    • LockRefreshedTime

我會考慮,如果LockRefreshedTime <解鎖的紀錄(現在 - 10分鐘)。

  • 如何保證鎖不會超過必要的時間,但不會意外過期?

我很喜歡jQuery,因此歡迎使用客戶端腳本的方法。這將是一個內部Web應用程序,所以我可以相當自由地使用帶寬/週期。我也想知道「悲觀鎖定」是否適合這個概念。

回答

8

這聽起來像你是大多數的方式。我不認爲你真的需要LockRefreshedTime,但它並沒有真正添加任何東西。您也可以使用LockAcquiredTime來決定鎖何時失效。

你會想要做的另一件事是確保你利用交易。您需要在數據庫事務中包裝檢查和設置鎖,以便最終不會有兩個認爲自己擁有有效鎖的用戶。

如果您的任務需要在多個資源上獲得鎖定(即給定類型或多於一種類型的記錄的多條記錄),則您需要按照相同的順序在任何位置應用鎖定鎖定。否則,你可以有一個死鎖,其中一位代碼有記錄A鎖定,並且想要鎖定記錄B,而另一位代碼已經B鎖定並正在等待記錄A。

至於如何確保鎖aren意外釋放。確保如果您有任何長時間運行的進程可能比鎖定超時運行更長,那麼它會在運行期間刷新其鎖定。

術語「顯式鎖定」也用於描述這個鎖定時間。

+0

+1很好的答案,謝謝。我會在24小時內不回答問題,希望能鼓勵更多的迴應。 – 2009-03-06 18:54:15

1

我已經手動完成了這項工作。

  • 將記錄的主鍵存儲到鎖定表中,並標記要編輯的模式屬性的記錄 。
  • 當其他用戶試圖選擇此記錄時,請指明用戶的僅有備用記錄 。
  • 有鎖定記錄的設置最長時間。
  • 刷新鎖定記錄的頁面數據。雖然允許用戶對 進行更改,但只允許所有其他用戶進行檢查。

鎖定表都應有類似這樣的設計:

User_ID, //who locked 
Lock_start_Time, 
Locked_Row_ID(Entity_ID), //this is primary key of the table of locked row. 
Table_Name(Entity_Name) //table name of the locked row. 

剩餘的邏輯是你必須把什麼事情弄清楚。

這只是我4年前根據客戶的特殊要求實施的想法。在那個客戶之後,沒有人再問我做過類似的事情,所以我還沒有實現任何其他方法。