2010-12-13 43 views
3

鎖定我似乎在SQL Server 2008中缺少的東西WRT鎖這是我的情景:只讀在SQL Server

  1. BEGIN TRAN。
  2. 從表A中讀取以確保找到特定的行。
  3. 讀取時,在讀取的單行上放置一個只讀鎖。如果找不到,則拋出錯誤。
  4. 插入表B,其中包括對錶A的引用。
  5. 提交tran(釋放鎖)。

由於各種設計約束,在這個特殊的情況下,我無法創建一個關係來爲我管理這個。所以我必須用代碼來完成。

我不想將XLOCK或UPDLOCK表A作爲我正在處理的事務從它讀取,而不是寫入。但是,顯然我不希望其他更新/刪除引用的行。 所以我需要從外部的角度只讀鎖

我不希望任何幻像讀取成爲可能。顯然,我不想要不同的行版本。

一旦TRAN承諾,這是罰款表A中修改,因爲觸發(後刪除),將空表B.參考

這是我有:

BEGIN TRAN 
-- test 
IF NOT EXISTS (
    SELECT 1 
    FROM Table1 
    WITH (HOLDLOCK, ROWLOCK) 
    WHERE (ID = @ID) 
) {throw} 

    {perform insert into Table2} 
COMMIT TRAN 

回答

1

在交易期間將您的交易隔離級別設置爲REPEATABLE READ。在我看來,這也是最好的,因爲你的代碼實現更加清晰,所以使用鎖定提示。

由於您只讀取單個行,因此您無需擔心向您的設置插入範圍,這是REPEATABLE READ的一個警告。

我建議閱讀書Professional SQL Server 2008 Internals and Troubleshooting中的「鎖定和鎖存」章節。它包含很好的解釋,包括代碼示例,SQL Server中提供的各種隔離級別以及描述每個數據異常場景的機制,如幻像等。

免責聲明:我不在這個頭銜的工資單,但我有兩個副本,一個硬和另一個kindle版,這是多好,它是我買了兩次!

+0

非常感謝約翰:) – IamIC 2010-12-13 20:30:42

+0

不客氣,很高興幫助! – 2010-12-13 21:43:00

相關問題