Ir para conteúdo
Fórum Script Brasil
  • 0

Minha Stored Procedure em rede não funciona legal


FONSENIX

Pergunta

Mais uma vez recorrendo aos amigos,

Criei uma SP que depois que eu envio o código do produto e a quantidade, ela faz a busca na tabela de produtos insere na tabela itens e ainda atualiza a quantidade. Bom, o que eu quero dizer é que esta SP é muito usada, mas em rede quando vou tentar funcionar meu projeto se tento usar em duas máquinas ao mesmo tempo ela trava.

Será que são muitas operações para uma SP apenas?

Ou será problema de transações?

Agradeço a quem puder ajudar.

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0
Seja mais completo nas informações.... tipo de banco de dados, versão do delphi, rede interna ou externa ...etc

quanto mais informações voce der, dar uma resposta fica mais facil.

abraço

Me desculpe Jhonas,

realmente eu deixei a desejar, rs.

Eu andei pesquisando aqui no fórum e meio que já achei as respostas, vamos ver se você concorda comigo.

Eu uso Firebird com MDO no Delphi 7.

Criei uma SP que recebe código e quantidade(que pode ser valor caso o código venha de uma etiqueta da balança) do produto.

Então pelo código a SP pesquisa na tb produtos, calcula o peso caso a quantidade seja um valor, dá um insert na tabela itens e um update da quantidade

na tabela produtos.

Então cheguei a conclusão que por ser uma SP muito usada, tenho que otimizar o tempo que a transação fica aberta.

Mas me deparei com outro problema, quando abro a venda pego o numero da venda pra ser usada na SP, percebi que dando CommitRetainning ela não ficaliza a transação, estou correto?

Percebi que enquanto mantenho uma tabela aberta como a itens da venda, uma transação também esta ativa é isto?

Espero ter sido mais claro pra conseguir ser ajudado,

Obrigado Jhonas

Link para o comentário
Compartilhar em outros sites

  • 0

Então cheguei a conclusão que por ser uma SP muito usada, tenho que otimizar o tempo que a transação fica aberta.

Mas me deparei com outro problema, quando abro a venda pego o numero da venda pra ser usada na SP, percebi que dando CommitRetainning ela não ficaliza a transação, estou correto?

Percebi que enquanto mantenho uma tabela aberta como a itens da venda, uma transação também esta ativa é isto?

Voce praticamente respondeu a sua dúvida

OBS: No componente IBTransaction

na propriedade Params deixe:

read_committed

rec_version

na propriedae DefaultAction deixe:

TACommit

na propriedade TraceFlas do componente IBDatabase deixe:

[tfQPrepare,tfQExecute,tfConnect,tfTransact,tfService]

isto deverá melhorar a performance

Dica de Mauro Pichiliani

A vantagem das Stored Procedures é que um programa chamador , Delph, só precisa chamar o nome da Stored Procedure, que pode conter diversos comandos Transact-SQL embutidos dentro dela, evitanto assim um tráfego de rede maior, resultando em resposta mais rápida.

O uso de Stored Procedure é encorajado, mais deve-se utilizar este recurso com cuidado pois se utilizado em excesso o SQL Server pode ser sobrecarregado, mas ao mesmo tempo podemos obter um ganho de performance considerável, dependendo do caso. Minhas ‘regrinhas’ para o uso de Stored Procedures:

* Não faça Stored Procedures que somente fazem um Select ou Update ou Delete. Para isso envie a instrução diretamente.

* Use sempre transações, para poder ‘voltar’ os dados em caso de problemas

* Retorne somente o necessário, evitanto tráfego na rede desnecessário.

* Use uma nomeclatura coerente para as Stored Procedures e as variáveis dentro dele

http://imasters.uol.com.br/artigo/223/sql_...red_procedures/

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu Jhonas,

mais uma vez obrigado, só mais algumas dúvidas:

Eu uso o MDO, e uso para as tabelas o MDODataSet, que já tem todos os comandos de inserção, update e delete nele.

O problema é que eu estava mantendo a tabela de itens aberta, mas enquanto a tabela fica aberta na tela de pedidos

fica uma transação também ativa.

Como eu contorno isso?

Valeu

Link para o comentário
Compartilhar em outros sites

  • 0

Uma das maneiras seria:

Quando a SP retorna algum valor, voce deve executá-la através de um componente Query

Quanto a SP não retorna valor, simplesmente passe os parâmetros necessários e execute-a.

ou simplesmente execute um select na SP.

exemplo:

select * from SP_NOME (cod_cliente)

coloque esta instrução no componente e abra-o como se fosse uma select numa tabela qualquer. no FB as SPs com resultado (SPs selecionáveis) são entendidas como uma tabela.

mdodataset.close;

mdodataset.commandtext := 'select * from SP_NOME (:cliente)';

mdodataset.parambyname('cliente').asinteger := cod_cliente;

mdodataset.open;

edit1.text := mdodataset.fields[0].asstring;

O problema é que eu estava mantendo a tabela de itens aberta, mas enquanto a tabela fica aberta na tela de pedidos

fica uma transação também ativa.

Neste caso use 'mdoQuery' e depois que tiver selecionado o item, efetue a transação.

outras informações:

http://74.125.45.104/search?q=cache:jJlstK...;cd=6&gl=br

tutorial sobre o MDO:

http://www.mdolib.com/doc/pt/mdo-ptbr.html

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Então pelo código a SP pesquisa na tb produtos, calcula o peso caso a quantidade seja um valor, dá um insert na tabela itens e um update da quantidade na tabela produtos.

...

Percebi que enquanto mantenho uma tabela aberta como a itens da venda, uma transação também esta ativa é isto?

O problema é que eu estava mantendo a tabela de itens aberta, mas enquanto a tabela fica aberta na tela de pedidos fica uma transação também ativa.
Parece que você achou a causa do DeadLock.

Como eu contorno isso?
Não use uma SP para fazer isto. Se estes valores calculados devem aparecer na tela neste momento da edição, é melhor que você faça a consulta na tabela produtos neste momento e realize os cáculos. O update na tabela de Produtos para realizar a baixa, você pode fazer através de trigger.

Para ler mais sobre transações, dê uma olhada neste post (no final) e acesse o último link para o artigo "Entendendo os tipos e configurações das transações"

Dúvidas específicas do MDO você pode tirar no grupo yahoo!: mdo-suport (para participar você tem que se registrar no yahoo!, mas pesquisar no que já há por lá não (e tem bastante coisa).

Sobre Firebird (em português), recomendo: FireBase

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu pessoal pela ajuda,

mas uma coisa ainda me parece obscura.

Se não posso manter uma tabela aberta para mostrar itens de um pedido, porque isso acarreta em manter uma transação aberta, qual a solução que vocês usam para mostrar itens de um pedido ou vendas de um cupom?

Porque eu estava usando um DBGrid para mostrar os itens ligado a tabela de itens.

Obrigado

Marcio.

Editado por FONSENIX
Link para o comentário
Compartilhar em outros sites

  • 0
Se não posso manter uma tabela aberta para mostrar itens de um pedido, porque isso acarreta em manter uma transação aberta, qual a solução que vocês usam para mostrar itens de um pedido ou vendas de um cupom?

Porque eu estava usando um DBGrid para mostrar os itens ligado a tabela de itens.

FONSENIX, na situação apresentada, pareceu que a procedure estaria tentando alterar (ou acessar) um item que estaria em edição na sua tela, e isto com a opção wait é que poderia estar gerando o deadlock, porque a procedure estaria esperando que o item em edição fosse "liberado" para atualização.

E sendo isto, não parece mesmo fazer sentido que você editando uma informação, chame um procedimento para fazer alterações nesta mesma informação simultanemente - neste caso, você faz os processamentos com esta informação no seu código mesmo.

Algumas coisas podem ser feitas no momento em que os dados vão para o banco, que é quando você utiliza as triggers.

Não sendo o que ocorreu, reveja as suas configurações de transações, porque que se eu entendi direito, o uso do MDODataSet não é o mesmo de um MDOTable. Isso porque os dados são retornados por uma consulta SQL, e as atualizações no banco são feitas através das outras propriedades (InsertSQL, DeleteSQL, UpdateSQL - acho que são esses os nomes da propriedade). Este componente é praticamente uma agregação de dois da paleta IB (IBSQL e IBUpdate).

Observe que a alteração de um mesmo registro por duas pessoas é possível, mas o banco vai gerenciar isto conforme definida na transação. Leia aquele artigo que citei e faça uns testes trabalhando com algumas combinações. Trabalhando com DBGrid, visualizando os dados, se você usar Commit na transação que está associada ao componente ligado ao DBGrid, a transação será fechada e você terá sua consulta fechada (se não estou enganado), então, nestes casos use CommiteRetained (teste e confira, se é isto mesmo).

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Então Micheus,

a SP apenas busca um produto e insere na tabela itens da venda.

Na tela de vendas eu mantinha um grid pra mostrar os itens daquela venda que não é usado para edição. Mas isto não deu certo, porque como citei acima, pra eu manter este grid funcionando mesmo que ligado a uma query como o amigo Jhonas sugeriu ela mantem uma transação ativa.

Agora estou mostrando os itens da venda em um memo, mas não fiquei muito satisfeito com isso.

Eu li os artigos que me sugeriu, e acho que compreendi sobre as transações.

A princípio tentei usar commitretainning, mas como a transação comita mas continua ativa, se outra máquina na rede for fazer uso da SP aí sim me da o deadlock.

Link para o comentário
Compartilhar em outros sites

  • 0
Acho que agora foi,

coloquei separei o componente que me tras os itens da venda em outro componente de transação.

Se foi mesmo, isto vem de encontro ao que postei há 2 anos aqui (neste post) e que foi a solução para outro colega, mas que quando postei em outro forum, fui questionado quanto a real aplicabilidade disto (usar duas transações).

Que bom que resolveu.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...