Mais tarde, tenho enfrentado muitas disputas de bloqueio de linha. A tabela em disputa parece ser uma tabela específica.
Isso geralmente é o que acontece -
- Desenvolvedor 1 inicia uma transação na tela inicial do Oracle Forms
- Desenvolvedor 2 inicia outra transação, de uma sessão diferente usando a mesma tela
~ 5 minutos depois, o front-end parece não responder. A verificação das sessões mostra a contenção de bloqueio de linha. A "solução" que todo mundo joga é matar sessões :/
Como desenvolvedor de banco de dados
- O que pode ser feito para eliminar as contenções de bloqueio de linha?
- Seria possível descobrir qual linha de um procedimento armazenado está causando essas contenções de bloqueio de linha
- Qual seria a diretriz geral para reduzir/evitar/eliminar tais problemas que codificam?
Se esta pergunta parecer muito aberta/insuficiente, sinta-se à vontade para editar/informar-me - farei o possível para adicionar algumas informações adicionais.
A tabela em questão está sob muitos inserts e atualizações, eu diria que é uma das tabelas mais ocupadas. O SP é bastante complexo - para simplificar - ele busca dados de várias tabelas, popula em tabelas de trabalho, muitas operações aritméticas ocorrem na mesa de trabalho e o resultado da mesa de trabalho é inserido/atualizado na tabela em questão.
A versão do banco de dados é Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64 bits. O fluxo da lógica é executado na mesma ordem em ambas as sessões, a transação não é mantida aberta por muito tempo (ou pelo menos eu acho ) e os bloqueios ocorrem durante a execução ativa das transações.
Atualização: a contagem de linhas da tabela é maior do que eu esperava, em cerca de 3,1 milhões de linhas. Além disso, depois de rastrear uma sessão, descobri que algumas instruções de atualização para esta tabela não estão utilizando o índice. Por que é assim - não tenho certeza. A coluna referenciada na cláusula where é indexada. No momento, estou reconstruindo o index.