Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como bloquear exclusivamente uma linha que impede a operação CRUD

BEGIN TRAN

    SELECT 1
    FROM Table
    WITH (XLOCK, ROWLOCK)

COMMIT TRAN

Isso será o suficiente.

EDITAR

Conforme observado por outros, você não pode bloquear uma linha para não ser lida . A única maneira que conheço de fazer isso é a seguinte:
WITH (UPDLOCK, TABLOCK)

E isso está assumindo que um WITH (NOLOCK) nunca é usado em uma instrução SELECT (o que deve ser evitado de qualquer maneira).

Eu testei isso e funcionará, embora o TABLOCK só deva ser usado em casos extremos. Certamente, se a simultaneidade for necessária, é uma solução ruim e alguma outra forma de bloqueio seria necessária. Uma maneira é atualizar uma coluna de bits "Available True/False" e ler apenas as linhas em que Available =True. Como @gbn sugeriu, READPAST poderia ser usado com isso.