2011-07-26 56 views
0

我是SQL Server的新手,但我對選擇/更新/刪除和其他事務等簡單事情有一定的瞭解。我在我的應用程序中遇到了死鎖情況。我已經理解了這種情況,因爲許多線程並行嘗試運行一組更新操作。它不是一次更新,而是一組更新操作。在SQL Server中手動處理鎖?

我知道這在應用程序中無法避免,因爲很多人都想同時進行更新。所以我想要一個手動鎖定系統。首先,線程1應檢查手動鎖是否可用,然後啓動事務。這意味着如果第二個線程請求鎖定,它應該很忙,因此第二個線程應該等待。一旦第一個完成,第二個應該獲得鎖定並開始交易。

這只是我想過的一個邏輯。但我不知道如何在SQL Server中執行此操作。有什麼可以幫助我的例子嗎?請讓我知道,如果你可以給我一些示例sql腳本或鏈接,這將有助於我。感謝您的時間和幫助。

回答

2

你可能是指「信號量」。也就是說,將DML的執行序列化爲一次只能運行一個進程的東西。

這在使用sp_getapplock

SQL Server本機可以配置第二個進程等待或者當他們打電話sp_getapplock失敗,並且還可以自行取消在「交易」模式。

0

您手動鎖定系統聽起來很有趣,但您需要意識到它會犧牲併發性,這對於許多OLT​​P應用程序來說非常重要。

先進的數據庫像Oracle和SQL服務器是非常好的避免死鎖,併爲您提供解決死鎖的工具,它可以幫助您殺死導致死鎖的會話並讓其他查詢完成它的工作。

微軟有文檔可以在這裏找到。 http://support.microsoft.com/kb/832524

除此之外,還有很多其他原因可能導致死鎖。你可以在這裏找到一些例子。 how to solve deadlock problem?

0

您仍然最有可能在相同的情況下結束。根據你量身定做的鎖具有死鎖。 SQL Server內部實現了一個非常強大的鎖定機制。你應該使用它。

您遇到的問題是資源(表,索引等)以不同的事務/線程以衝突的順序被訪問(或修改)。

如果您創建了自己的鎖定機制,則最終可能會出現死鎖。例如:

  1. 線程1上創建客戶記錄的鎖
  2. 線程2上創建訂單記錄鎖定
  3. 線程1名試圖創建訂單記錄一個鎖(但不能繼續由於步驟2)
  4. 線程2名試圖創建客戶記錄鎖(但不能進行,由於步驟3)

瞧......死鎖

解決方案是重構訪問資源的方式,因此始終以相同的順序訪問記錄,問題將消失。

  1. 線程1上創建客戶記錄鎖定
  2. 線程2名試圖創建客戶記錄鎖(但不能進行,由於步驟1)
  3. 線程1的訂購記錄創建一個鎖
  4. 線程1完成交易,並同時解除訂單和客戶記錄
  5. 線程2上創建客戶記錄鎖定
  6. 線程2上創建的訂單記錄鎖定

另外,看看here來了解如何鎖定可能發生在一張桌子上。