Transações Delphi X firebird
Boa Tarde, Senhores!!!
Estou há algum tempo procurando a melhor forma de trabalhar com controle de transações no delphi com firebird, já pesquisei muito material, sei como´startar´, ´comitar´ e ´rollback´, mas até agora não vi exemplos práticos de como utilizar isto num projeto. Vou ser mais específico:
Devo controlar as transações por acesso ao banco (uma transação por aplicativo rodando) ou controlar as transações por tipo de cadastro(produto, fornecedor, pedido, etc)?
Obs. No meu projeto atual o usuário consegue inserir um novo tipo de produto na inclusão de um pedido, po exemplo.
Estou há algum tempo procurando a melhor forma de trabalhar com controle de transações no delphi com firebird, já pesquisei muito material, sei como´startar´, ´comitar´ e ´rollback´, mas até agora não vi exemplos práticos de como utilizar isto num projeto. Vou ser mais específico:
Devo controlar as transações por acesso ao banco (uma transação por aplicativo rodando) ou controlar as transações por tipo de cadastro(produto, fornecedor, pedido, etc)?
Obs. No meu projeto atual o usuário consegue inserir um novo tipo de produto na inclusão de um pedido, po exemplo.
Makarioszen
Curtidas 0
Melhor post
Emerson Nascimento
20/08/2009
no caso de gravação de um único registro não há necessidade de abrir uma transação, pois se uma não estiver aberta, o próprio SGBDR abre uma implícitamente e a fecha (commit ou rollback) após tentar gravar o registro.
uma transação explícita só é necessária no caso de manipular mais de 1 registro e, caso ocorra algum erro, nada deva ser gravado. por exemplo:
se você tem um procedimento para geração de notas fiscais que, ao confirmar a geração da nota:
- grave a nota em si
- gere os títulos no financeiro
- manipule o estoque
- grava os registros contábeis
- manipula os livros fiscais
nesse caso você deve abrir a transação antes de iniciar a primeira tarefa e tenta ´comitar´ ao finalizar a última. caso alguma levante alguma exceção, você dá um rollback e cancela todas as alterações.
uma transação explícita só é necessária no caso de manipular mais de 1 registro e, caso ocorra algum erro, nada deva ser gravado. por exemplo:
se você tem um procedimento para geração de notas fiscais que, ao confirmar a geração da nota:
- grave a nota em si
- gere os títulos no financeiro
- manipule o estoque
- grava os registros contábeis
- manipula os livros fiscais
nesse caso você deve abrir a transação antes de iniciar a primeira tarefa e tenta ´comitar´ ao finalizar a última. caso alguma levante alguma exceção, você dá um rollback e cancela todas as alterações.
try StartTransaction; NotaID := gravaNota; // grava a nota e obtem o ID geraTitulos( NotaID ); // gera os títulos no financeiro manEstoqueNF( NotaID ); // efetiva a manutenção no estoque contGerNF(NotaID ); // grava os registros contábeis livrosGerNF( NotaID ); // manipula os livros fiscais Commit; // tenta gravar os dados except Rollback; // caso haja erro em alguma das rotinas, cancela tudo end
GOSTEI 1
Mais Respostas
Dicasecodigosdelphi
19/08/2009
Boa Tarde, Senhores!!!
Estou há algum tempo procurando a melhor forma de trabalhar com controle de transações no delphi com firebird, já pesquisei muito material, sei como´startar´, ´comitar´ e ´rollback´, mas até agora não vi exemplos práticos de como utilizar isto num projeto. Vou ser mais específico:
Devo controlar as transações por acesso ao banco (uma transação por aplicativo rodando) ou controlar as transações por tipo de cadastro(produto, fornecedor, pedido, etc)?
Obs. No meu projeto atual o usuário consegue inserir um novo tipo de produto na inclusão de um pedido, po exemplo.
Boa noite, voce deve iniciar uma transação para cada cadastro tipo inclui um produto starta transação faz o applyupdate e commit, é mais garantido pois se der problema ele retornara apenas o trecho entre o start e commit. No caso de "produto na inclusão de um pedido" start transação para produto commit da um refresh depois carrega o produto para o pedido que ja te outra transação startada e no final do pedido comita o pedido
GOSTEI 0
Keron
19/08/2009
Um pequeno exemplo prático de transação
A cada cadastro como falou nosso colega acima, lembrando de deixar a transação aberta o menor tempo possível.
if not IBTransacao.InTransaction then IBTransacao.StartTransaction; SPCadastroParametros.Params[0].Value:=vb_numero; SPCadastroParametros.Params[1].Value:=vb_numconta; SPCadastroParametros.Params[2].Value:=vb_tipo; SPCadastroParametros.ExecProc; IBTransacao.Commit;
A cada cadastro como falou nosso colega acima, lembrando de deixar a transação aberta o menor tempo possível.
GOSTEI 0
Keron
19/08/2009
Um pequeno exemplo prático de transação
A cada cadastro como falou nosso colega acima, lembrando de deixar a transação aberta o menor tempo possível.
if not IBTransacao.InTransaction then IBTransacao.StartTransaction; SPCadastroParametros.Params[0].Value:=vb_numero; SPCadastroParametros.Params[1].Value:=vb_numconta; SPCadastroParametros.Params[2].Value:=vb_tipo; SPCadastroParametros.ExecProc; IBTransacao.Commit;
A cada cadastro como falou nosso colega acima, lembrando de deixar a transação aberta o menor tempo possível.
GOSTEI 0