Como descobri, você pode definir um bloqueio na tabela desejada em uma transação com:
begin tran
select 1 from myTable
with (tablock /*or tablockx to block even reads from table*/, holdlock)
-- do your work
commit tran
Mas quando executo este código em uma tabela de servidor vinculado, a tabela ainda pode ser acessada de dentro do servidor vinculado! Por quê? Como posso definir um bloqueio nesta tabela remota como meu exemplo?
Ao tentar executar uma transação em vários servidores, você precisa usar
BEGIN DISTRIBUTED TRANSACTION
em vez deBEGIN TRANSACTION
.Se meu entendimento estiver correto,
BEGIN TRANSACTION
cria uma transação local por padrão. Sob certas circunstâncias (por exemplo, se você estiver fazendo umaUPDATE
operação em uma mesa no servidor remoto), isso será escalado para uma transação distribuída. Se vocêremote proc trans
ativou o servidor remoto, coisas como a execução de um procedimento armazenado remoto também devem escalar automaticamente para transações distribuídas.Caso contrário, a operação remota seguirá as regras normais de transação como uma operação autônoma no servidor remoto - neste caso, a operação
SELECT
estaria em sua própria transação "local" de uma instrução no servidor remoto, e o bloqueio seria liberado quando oSELECT
concluído.Você também pode precisar usar
SET XACT_ABORT ON
.E, (como você observou nos comentários), você precisará ter certeza de que o serviço MS Distributed Transaction Coordinator está ativado .