Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

contenção de linha oracle causando erros de deadlock no aplicativo JMS de alta taxa de transferência


Um deadlock implica que cada thread está tentando atualizar várias linhas em uma única transação e que essas atualizações estão sendo feitas em uma ordem diferente entre os threads. A resposta mais simples possível, portanto, seria modificar o código para que as mensagens dentro da mesma transação sejam aplicadas em alguma ordem definida (ou seja, na ordem da chave primária). Isso garantiria que você nunca obteria um deadlock, embora ainda obteria bloqueios de bloqueio enquanto um thread espera que outro thread confirme sua transação.

Dando um passo para trás, porém, parece improvável que você realmente queira que muitos threads atualizem a mesma linha em uma tabela quando você não pode prever a ordem das atualizações. Parece altamente provável que isso levaria a muitas atualizações perdidas e a um comportamento bastante imprevisível. O que, exatamente, seu aplicativo está fazendo para tornar esse tipo de coisa sensata? Você está fazendo algo como atualizar tabelas agregadas depois de inserir linhas em uma tabela de detalhes (ou seja, atualizar a contagem do número de visualizações de uma postagem, além de registrar informações sobre uma visualização específica)? Em caso afirmativo, essas operações realmente precisam ser síncronas? Ou você pode atualizar a contagem de visualizações periodicamente em outro thread agregando as visualizações nos últimos N segundos?