Como o SQL Server determina a ordem em que ele bloqueia ao selecionar uma tabela?

10

Eu tenho dois procedimentos armazenados que estão travando quando o sistema está sob carga. O processo A é selecionado em uma tabela enquanto o processo B é inserido na mesma tabela. O Gráfico de bloqueio está mostrando que o Proc A possui um bloqueio de página no modo S, pelo qual o Proc B deseja um bloqueio no modo IX, o Proc A, no entanto, está aguardando um bloqueio de página no modo S para uma página diferente na qual o Proc B já possui um bloqueio de página no modo IX. .

Claramente, isso poderia ser resolvido, garantindo que ambas as consultas bloqueiem as páginas da tabela na mesma ordem, mas não consigo descobrir como fazer isso.

Minha pergunta é: como o SQL Server determina em que ordem bloquear páginas enquanto faz INSERTs e SELECTs e como você pode modificar esse comportamento?

Martin Brown
fonte

Respostas:

2

Como o SQL Server determina em que ordem bloquear as páginas enquanto faz INSERTs e SELECTs

Indeterminado - feito pelo processamento interno e dependendo da saída do otimizador de consulta.

e como você pode modificar esse comportamento?

Controle seu isolamento. Se você ler para escrever, peça ao SQL Server para obter imediatamente um bloqueio de gravação. Ponto fechado.

TomTom
fonte
1

Atualmente, o processo A possui um bloqueio compartilhado.

"Nenhuma outra transação pode modificar os dados enquanto existirem bloqueios compartilhados (S) no recurso." http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

Se você estiver no sql 2005 ou superior, tente usar o isolamento de instantâneo.

"O nível de isolamento de captura instantânea usa controle de versão de linha para fornecer consistência de leitura no nível da transação. As operações de leitura não adquirem bloqueios de página ou linha; somente os bloqueios de tabela SCH-S são adquiridos. Ao ler as linhas modificadas por outra transação, eles recuperam a versão da linha que existia quando a transação foi iniciada. Você só pode usar o isolamento de Captura Instantânea em um banco de dados quando a opção de banco de dados ALLOW_SNAPSHOT_ISOLATION estiver ativada. Por padrão, essa opção está desativada em bancos de dados do usuário. " http://msdn.microsoft.com/en-us/library/ms189122.aspx

Como apenas os bloqueios Sch-S são adquiridos, sua leitura 'não deve ser capaz de bloquear sua' gravação.

"Os bloqueios de estabilidade do esquema (Sch-S) não bloqueiam nenhum bloqueio transacional, incluindo bloqueios exclusivos (X)." http://msdn.microsoft.com/en-us/library/ms189122.aspx

Lembre-se de que o Snapshot Isolation Level faz uso intensivo de tempdb para controle de versão de linha; portanto, dimensione-o adequadamente e siga as práticas recomendadas para estratégias de disco tempdb.

Brian
fonte