Pergunta

Eu não sou um grande programador VB, mas eu estou encarregado de manter / melhorar um aplicativo de desktop VB6 que usa Sybase ASE como um back-end. Este aplicativo tem cerca de 500 usuários.

Recentemente, eu acrescentou funcionalidade para esta aplicação que realiza uma inserção / atualização adicional para uma única linha no banco de dados, campo de chave número de transação ser e o campo é indexado. O ser tabela atualizada geralmente tem cerca de 6000 registros, como registros são removidos quando as transações são concluídas. Após a implantação, o aplicativo funcionou bem para um dia e meio antes que os usuários estavam relatando um desempenho lento.

Por fim, traçamos o problema de desempenho a um bloqueio tabela no banco de dados e teve que reverter para a versão anterior do aplicativo. O primeiro dia de uso foi na segunda-feira, que é geralmente um dia muito pesado para uso do sistema, por isso estou confuso por que a questão não apareceu naquele dia.

No código que estava no lugar, há uma chamada para iniciar uma transação Sybase. Dentro do bloco entre os BeginTrans e CommitTrans, há uma chamada para um arquivo DLL que atualiza o banco de dados. Eu coloquei meu novo código em um módulo de classe na DLL.

Estou confuso sobre o porquê de um único insert / update para uma única linha causaria um problema, especialmente desde que o sistema foi funcionando bem antes da mudança. É possível que eu tenha exposto um problema maior aqui? Ou que eu só preciso reconsiderar a minha abordagem?

Graças à frente de qualquer pessoa que tenha estado em uma situação semelhante e podem oferecer conselhos.

Foi útil?

Solução

Acontece que o culpado era uma caixa de mensagem que aparece no âmbito das chamadas BeginTrans e CommitTrans. O usuário com a caixa de mensagem iria manter um bloqueio de bloqueio no banco de dados até que eles reconheceram a mensagem. A solução foi para mover a caixa exterior mensagem do âmbito acima mencionado.

Outras dicas

Eu não sou capaz de entender o quadro completo sem o código SQL, que você está usando.

Além disso, se é uma única inserção ou atualização, porque você está usando uma transação? É possível que muitos usuários vão tentar atualizar a mesma linha?

Seria útil se você postou tanto o código VB e SQL (com o plano de consulta, se possível). No entanto, com a informação que temos; Eu corria update statistics table_name contra a mesa para se certificar de que o plano de consulta é até à data.

Se você tem certeza que seu código tem que correr dentro de uma transação você já tentou adicionando seu próprio bloco de transação que contém o SQL em vez de usar o que já está lá?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top