Até tarde, tenho enfrentado muitas contenções de bloqueio de linha. A tabela em disputa parece ser uma tabela específica.
Geralmente é o que acontece -
- O desenvolvedor 1 inicia uma transação na tela front-end do Oracle Forms
- O desenvolvedor 2 inicia outra transação, a partir de uma sessão diferente, usando a mesma tela
~ 5 minutos depois, o front end parece não responder. A verificação de sessões mostra a contenção de bloqueio de linha. A "solução" que todo mundo usa é 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 esses problemas que codificam?
Se essa pergunta parecer muito aberta / insuficiente, fique à vontade para editar / me avisar - farei o possível para adicionar algumas informações adicionais.
A tabela em questão está sujeita a muitas inserções e atualizações, eu diria que é uma das tabelas mais movimentadas. O SP é bastante complexo - para simplificar - busca dados de várias tabelas, preenche-os em tabelas de trabalho, muitas operações aritméticas ocorrem na tabela de trabalho e o resultado da tabela de trabalho é inserido / atualizado na tabela em questão.
A versão do banco de dados é o Oracle Database 10g Enterprise Edition, versão 10.2.0.1.0 - 64 bits. O fluxo da lógica é executado na mesma ordem nas duas sessões, a transação não é mantida aberta por muito tempo (ou pelo menos acho que sim) 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, com 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 nesta tabela não estão utilizando o índice. Por que é assim - não tenho certeza. A coluna referenciada na cláusula where é indexada. Atualmente, estou recriando o índice.
COMMIT
ou ROLLBACK
em um tempo razoável ou b) organizar de modo que as mesmas pessoas nem sempre desejem a mesma linha ao mesmo tempo.