CONCORRENCIA FIREBIRD.
Olá, utilizo ADO com VB6 acessando firebird, meu problema é que quando vou baixar o estoque dos produtos, está ocorrendo DEADLOCK. Isso quando programa funcionando em dois terminais. Estou utilizando o begintrans e commit.
Como fazer com que o processo fique na fila até que um outro processo termine (commit).
Desde ja agradeço a atenção de todos.
Como fazer com que o processo fique na fila até que um outro processo termine (commit).
Desde ja agradeço a atenção de todos.
Isso não tem como fazer .. tem que ter bastante cuidado para usar transações pois é isso mesmo que acontece a tabela que ja teve alterações não comitadas fica travada. ate aonde sei a unica maneira de fazer isso e tirando as transações. O que você pode fazer e colocar as transações bem perto do execute assim comitando assim que executado o comando , agora se for uma rotina com varias querys ... te aconselho a tirar e usar um outro metodo para caso que algum problema durante o processamento.
Você está fazendo o uso de procedures ou triggers para a baixa?
Se vc criar uma condição para que sempre que a saÃda/venda for confirmada/fechada disparar um trigger que chame a procedure que executa a abaixa, o próprio SGBD irá controlar as transações.
Se vc criar uma condição para que sempre que a saÃda/venda for confirmada/fechada disparar um trigger que chame a procedure que executa a abaixa, o próprio SGBD irá controlar as transações.
O maior motivo de ocorrencias de DEADLOCK é TIMEOUT, ou seja, você abre uma transação e ai fica com ela aberta enquanto pede alguma intervenção do usuário. Não é raro o usuário esquecer ou simplesmente demorar para continuar. Ai, poderá ocorrer um DEADLOCK.
A melhor forma é mudar a maneira de tratar os dados. Só inicie uma transação quando já tiver todos os dados a atualizar e assim que acabar, termine a mesma, NUNCA deixando ela aberta. Adote também a seguinte formula: UMA TRANSAÇÃO DEVE SER ABERTA E FECHADA NO MESMO FLUXO DE DADOS, SEM INTERVENÇÃO DE NENHUM DISPOSITIVO EXTERNO EXCETO O PRÓPRIO BANCO DE DADOS.
Como recomendação final, o ideal mesmo, uma vez que você usa um SGBD, é usar Stored Procedures e Triggers para executar lotes de instruções de atualização do Banco que podem depender uns dos outros. Dentro da Stored Procedure, você inicializa a transação, processa os dados e dá COMMIT ou ROLLBACK.
A melhor forma é mudar a maneira de tratar os dados. Só inicie uma transação quando já tiver todos os dados a atualizar e assim que acabar, termine a mesma, NUNCA deixando ela aberta. Adote também a seguinte formula: UMA TRANSAÇÃO DEVE SER ABERTA E FECHADA NO MESMO FLUXO DE DADOS, SEM INTERVENÇÃO DE NENHUM DISPOSITIVO EXTERNO EXCETO O PRÓPRIO BANCO DE DADOS.
Como recomendação final, o ideal mesmo, uma vez que você usa um SGBD, é usar Stored Procedures e Triggers para executar lotes de instruções de atualização do Banco que podem depender uns dos outros. Dentro da Stored Procedure, você inicializa a transação, processa os dados e dá COMMIT ou ROLLBACK.
ok, acho q vou usar trigger entao para efetuar baixas no estoque....obrigado pela atencao de todos e um abraço.
Tópico encerrado , respostas não são mais permitidas