Eu tenho duas instruções de atualização na mesma tabela que recebem bloqueios de página em ordens diferentes. Isso leva a impasses.
- O processo A possui um bloqueio de atualização na página 1 e solicita um bloqueio de atualização na página 2.
- O processo B possui um bloqueio de atualização na página 2 e deseja um bloqueio de atualização na página 1.
Como posso forçar ambas as instruções a fazerem bloqueios de página na mesma ordem?
Você não pode. Em vez disso, force os dois a usar um bloqueio de tabela com uma dica TABLOCKX ou use um bloqueio de aplicativo para serializar as sessões.
Você pode forçar a sequência de acesso à página na instrução SQL. Você pode encontrar um plano para cada consulta que tenha a mesma sequência de acesso e aplicar um guia de plano. IIRC isso é apenas uma sugestão e o mecanismo de execução não pode usá-lo em tempo de execução.
As páginas são acessadas e bloqueadas porque as linhas dessas páginas estão bloqueadas. Se você puder forçar a ordem em que as linhas são tocadas, talvez por um cursor, isso resolverá esse problema. Claro que agora você tem outros problemas.
Presumivelmente, as duas consultas não estão tocando nas mesmas linhas. O SQL Server oferece suporte a bloqueios de linha. Você tem que definir as tabelas e índices de acordo.