2013-06-13 103 views
2

我有一個交易包括幾個表。在我從EDITED_TABLE刪除了一些記錄後,我需要防止插入到TABLE_TO_BE_LOCKED。目前我使用TABLOCKXTABLOCK,HOLDLOCK是否足以防止INSERT?

DELETE EDITED_TABLE FROM EDITED_TABLE 
left join TABLE_TO_BE_LOCKED with (TABLOCKX) on .... 
WHERE ... 

我需要防止插入新記錄到TABLE_TO_BE_LOCKED但我想保留的可能性閱讀。 DELETETABLE_TO_BE_LOCKED之後仍然沒有改變,這是顯式鎖定的原因。我可以使用TABLOCK, HOLDLOCK而不是TABLOCKX嗎?

注:

我知道How to lock a table for inserting in sql?。但是,結果不要這樣做,以防止主鍵中的重複。

+0

爲什麼不直接使用'SELECT FOR UPDATE'和事務? – millimoose

+0

@millimoose:在SQL Server中不存在 – gbn

回答

4

如果表已寫入到事務中,則獨佔鎖將保留到事務結束。在這種情況下,您不能啓用SELECT,除非您在SELECT上使用NOLOCK,但您會看到已刪除的行。

TABLOCK, HOLDLOCK將只是鎖定整個表專門直到交易結束

這聽起來像你試圖解決您選擇的解決方案:提供更多信息,我們也許能夠提供一個更好的是什麼一樣你想要沒有鎖的提示。例如,如果您的交易需要刪除的數據的一致視圖不受執行插入其他事務,那麼你可以嘗試一種或多種

  • OUTPUT子句在您開始使用
  • 使用的數據集工作SERIALIZABLE只保留範圍(這是HOLDLOCK BTW)
  • 使用SNAPSHOT isolation modes

後評論...

BEGIN TRAN 

SELECT * 
INTO #temp 
FROM TABLE_TO_BE_LOCKED 
WHERE .. -- or JOIN to EDITED_TABLE 

DELETE EDITED_TABLE FROM EDITED_TABLE 
left join #temp with (TABLOCKX) on .... 
WHERE ... 

-- do stuff with #temp 

COMMIT 
+0

爲了更清楚地表達問題,我修改了這個問題。 – IvanH

+0

@IvanH:謝謝。爲什麼要TABLE_TO_BE_LOCKED沒有INSERTS?它後來被讀了嗎? – gbn

+0

稍後會在事務中處理它,但我需要確保在使用它時沒有新記錄。 – IvanH

相關問題