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

Obter o bloqueio de tabela de atualização no início do procedimento armazenado no SQL Server


Você disse:

Você simplesmente precisa de um bloqueio de leitura compartilhado para a duração do TXN. Isso significa que nenhum outro processo pode obter um bloqueio de "gravação", em conjunto com um TABLOCK. E você também não precisa de COUNT.
...
   BEGIN TRANSANCTION
     SELECT TOP 1 KeyCol FROM TheTable WITH (TABLOCK, HOLDLOCK)
...

Por que você acha que quer um UPDATE LOCK?

HOLDLOCK ou SERIALIZABLE

Editar, após comentário:
  • "bloqueio exclusivo" significa "apenas um processo usando os dados".
  • "SERIALIZABLE" basicamente significa manter os bloqueios (compartilhados, exclusivos, o que for) por muito mais tempo.

Você não pode especificar "bloqueio exclusivo" e permitir que outros processos leiam. Os conceitos são mutuamente exclusivos. Você deseja evitar gravações em toda a tabela, que uma persistência bloqueio compartilhado/leitura fará. É aqui que entra o SERIALIZÁVEL.

De "Modos de bloqueio"

Então:um bloqueio compartilhado não permite gravações e pode ser feito para persistir tornando-o SERIALIZÁVEL