Bloquear Registro
Uso FB1.5 e Delphi 7 IBX -> IBDataSet
Transaction -> Read-Committed
Um Componente Transaction para cadastros e outro para Pedido
1º Problema
- Edito um produto (deixo em edição)
- Lanço um pedido que contenha este produto e gravo
- Confirmo a alteração do produto
Erro: O Estoque deste produto permanece o mesmo. Ou seja, toda a movimento perde ao gravar o produto.
Resolvi tirando o campo estoque no ModifySQL do IBDataSet.
Estou certo ou existe outra maneira mais correta?
2º Problema
- Quando duas ou mais usuários lançam um pedido que contenha o mesmo produto e confirmam a inclusão ao mesmo tempo, gerando um DeadLock. (A Rotina de atualizar o estoque está em uma trigger)
Como resolver isto? Teria como esperar o registro sair da edição?
Transaction -> Read-Committed
Um Componente Transaction para cadastros e outro para Pedido
1º Problema
- Edito um produto (deixo em edição)
- Lanço um pedido que contenha este produto e gravo
- Confirmo a alteração do produto
Erro: O Estoque deste produto permanece o mesmo. Ou seja, toda a movimento perde ao gravar o produto.
Resolvi tirando o campo estoque no ModifySQL do IBDataSet.
Estou certo ou existe outra maneira mais correta?
2º Problema
- Quando duas ou mais usuários lançam um pedido que contenha o mesmo produto e confirmam a inclusão ao mesmo tempo, gerando um DeadLock. (A Rotina de atualizar o estoque está em uma trigger)
Como resolver isto? Teria como esperar o registro sair da edição?
Lucianoko
Curtidas 0
Respostas
Afarias
29/12/2003
Tirar o campo estoque do UpdateSQL no cadastro do produto e manter a atualização do registro de estoque em uma trigger são boas abordágens.
Os registros são bloqueados quando vc altera e dá um POST. Procure COMITAR a transação assim q realizar o post.
Se ainda assim tiver pequenos conflitos, coloque as transações em WAIT -- mas tenha cuidado para não manter ´bloqueios´ longos.
T+
Os registros são bloqueados quando vc altera e dá um POST. Procure COMITAR a transação assim q realizar o post.
Se ainda assim tiver pequenos conflitos, coloque as transações em WAIT -- mas tenha cuidado para não manter ´bloqueios´ longos.
T+
GOSTEI 0
Raserafim
29/12/2003
afarias, vc pode dar um exemplo de como fazer isso em uma trigger?
GOSTEI 0
Afarias
29/12/2003
|afarias, vc pode dar um exemplo de como fazer isso em uma trigger?
tudo depende muito da estrutura do banco, mas supondo algo básico como:
tabela: produtos {cod, desc, preco, estoque}
tabela: itens_venda {num, cod_venda, cod_prod, qtde, preco, total_item}
vc pode então ter uma trigger after insert em itens_venda da forma:
bom, *dependendo* da sua forma/política de ´correção´ de vendas etc, vc pode ter a necessidade tb de criar uma trigger after update para o caso de uma qtde de item de venda for alterado depois de incluída a venda, algo +/- assim:
bom, note q esses são códigos exemplos!
T+
tudo depende muito da estrutura do banco, mas supondo algo básico como:
tabela: produtos {cod, desc, preco, estoque}
tabela: itens_venda {num, cod_venda, cod_prod, qtde, preco, total_item}
vc pode então ter uma trigger after insert em itens_venda da forma:
create trigger tr_estoque1 for itens_venda after insert as begin update produtos set estoque = estoque - new.qtde where cod = new.cod_prod; end;
bom, *dependendo* da sua forma/política de ´correção´ de vendas etc, vc pode ter a necessidade tb de criar uma trigger after update para o caso de uma qtde de item de venda for alterado depois de incluída a venda, algo +/- assim:
create trigger tr_estoque1 for itens_venda after update as begin update produtos set estoque = estoque + old.qtde - new.qtde where cod = new.cod_prod; end;
bom, note q esses são códigos exemplos!
T+
GOSTEI 0