2012-07-13 15 views
0

我正在使用readcommited隔離級別更新一個事務中的一行。從其他事務處理,我應該如何找到放置在同一行上的鎖而不嘗試更新該行。 有什麼想法?如何在不更新記錄的情況下知道某一行的鎖定狀態

+0

的可能重複[如何檢查被保持在一個表,鎖(http://stackoverflow.com/questions/694581/how-to-check-which-locks-are-held-on- a-table) – 2012-07-13 04:55:22

+0

此線程http://forums.devart.com/viewtopic.php?t=14418顯示,查詢行級鎖將非常繁瑣 – 2012-07-13 06:33:17

回答

1

要獲取有關鎖定的信息,您可以執行sp_lock程序。

注意:VIEW SERVER STATE權限是必需的。

在SQL Server 2008中,您可以使用sys.dm_tran_locks動態管理視圖。

2

檢查鎖定的唯一方法是獲取鎖定你的自我。這不是特定於數據庫的,是併發性的一般問題。檢查鎖是否被鎖定的任何形式的API都會從根本上被破壞,因爲根據定義,根據此API檢查的結果執行的任何操作都是錯誤的,因爲基礎不舊,過時的信息。知道該鎖沒有舉行時,API檢查它並不意味着不被API返回時。

如果您在詢問有關鎖,您不可能寫出正確的程序。編寫正確程序的唯一方法是獲取鎖。與其他編程語言一樣,SQL也是如此。

沒有什麼能阻止您嘗試獲取即時超時的鎖(SET LOCK_TIMEOUT 0)並處理衝突時發生的鎖超時錯誤。

+0

感謝您的設計資訊。你能否請詳細說明或解釋一些關於獲取鎖的方法。 – 2012-07-13 06:31:41

+1

使用[鎖定提示](http://msdn.microsoft.com/en-us/library/ms187373.aspx)。解釋你的情況,也許我們可以提供更多的細節如何去做。 – 2012-07-13 06:49:00

+1

作爲一條評論:使用DMV查詢行鎖定基本上是不可能的,因爲您必須確切知道鎖定協議和數據庫的物理結構。例如:通過查看密鑰鎖資源來檢查密鑰'foo'的行是否被鎖定或者沒有(並且祝你好運*編譯*)是不夠的。一個concurent事務可能已經使用了頁面粒度,並且只鎖定了包含該行的* page *。你贏不了這個。 – 2012-07-13 06:53:24

1

我認爲你可以找到關於表級鎖不上的行級

試試下面的代碼,它會給這是目前鎖定表。

SELECT t.name as [Table Name] 
FROM sys.dm_tran_locks as t1 
Join sys.objects o1 on o1.object_id = t1.resource_associated_entity_id 
Join sys.tables t on o1.object_id = t.object_id 
+0

感謝您的幫助。似乎無法獲得行級鎖。參考http://forums.devart.com/viewtopic.php?t=14418 – 2012-07-13 06:29:43

相關問題