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