2010-07-22 3 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

Я не говорю, что вам это не нужно, но я бы ожидал серьезного нарушения конкуренции, если часто попадает в proc. Можете ли вы дать подробную информацию, зачем вам это нужно? –

+0

Его не следует часто ударять чаще всего один раз. У нас есть хранимая процедура, которая позволит отслеживать изменения для конкретной таблицы. Когда эта процедура является вызовом, мы хотим заблокировать таблицу, чтобы никто не мог выполнять операцию DML в таблице. Как только процедура будет завершена, мы хотим освободить замок. Процедура не займет много времени. – pdiddy

ответ

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

для блокировки X, почему вы делаете удаление? Вы не можете сделать выбор? – pdiddy

+1

Да, однако, я хотел избежать фактического возвращения каких-либо строк. – etliens

Смежные вопросы