2010-07-22 14 views
2

我想在存儲過程執行時鎖定表格。如何在操作過程中鎖定表格

這是一個好方法嗎?

CREATE PROCEDUE sp_test 
@tableName nvarchar(128) 
AS 

DECLARE @sql nvarchar(MAX) = 'SELECT * FROM ' + @tableName + 'WITH TABLOCK' 
EXEC @sql 

-- DO my operations 

-- How Do I release the lock? or does it get release when the execution is done 

或者是否有更好的方法來實現這一點。

感謝

+1

我並不是說你不需要這個,但是如果這個過程頻繁發生,我會期待嚴重的鎖爭用。你能否提供詳細說明你爲什麼需要它? – 2010-07-22 21:38:31

+0

最不可能經常打一次。我們有一個存儲過程,可以爲特定的表啓用更改跟蹤。當這個過程是調用時,我們想要鎖定表,以便沒有人可以在表上執行DML操作。一旦程序完成,我們想釋放鎖。該過程不需要很長時間就可以執行。爲X鎖, – pdiddy 2010-07-23 13:10:16

回答

2

你可以採取具體鎖在桌子上的過程調用的開始。

如果你想防止數據修改表中,你可以採取IX鎖。

SET XACT_ABORT ON; 
BEGIN TRAN 
    SELECT * FROM <<TABLENAME>> WITH(UPDLOCK, SERIALIZABLE) WHERE 1=0; 
    -- DO STUFF 
    SELECT * FROM sys.dm_tran_locks WHERE request_session_id = @@spid; 
COMMIT TRAN 

如果你想防止任何其它進程訪問您可以採取的X鎖的數據。當然這並不妨礙任何未提交的讀取。

SET XACT_ABORT ON; 
BEGIN TRAN 
    DELETE FROM <<TABLENAME>> WITH(XLOCK, TABLOCK, SERIALIZABLE) WHERE 1=0; 
    -- DO STUFF 
    SELECT * FROM sys.dm_tran_locks WHERE request_session_id = @@spid; 
COMMIT TRAN 

當事務被提交/回滾時,鎖被釋放。

+0

,你爲什麼要刪除?你不能做一個選擇嗎? – pdiddy 2010-07-26 13:45:37

+1

是的,但是,我想避免實際返回任何行。 – etliens 2010-07-27 01:24:27