Transações em multicamadas
Boa tarde pessoal,
Volto a solicitar a ajuda de vcs sobre transações em aplicações multicamadas...
Estou com o seguinte problema:
Tenho o seguinte cenário:
BD -> Camada de Acesso -> Camada de apresentação
na camada de acesso, tenho o componente de conexao, query´s e dsp´s.
na camada de apresentação tenho os clientdataset´s q sao ligados aos providers, frente a isto, insiro, altero e excluo normalmente..
porém, estou implementando um log de usuarios, onde eu gravo tudo q o usuario fez, se incluiu, alterou, excluiu..etc
estou fazendo isto no evento beforeupdaterecord dos dsp´s na camada de acesso: ex.
entao, toda vez q postar ou excluir um registro em um clientdataset na camada de apresentação, vou gravar um registro em uma tabelinha de logs, só q desta forma, eu corro risco de ter um log sem q o registro em questao tenha sido gravado ou excluido, pq o banco de dados ainda poderá me retornar erro como violação de PK ou FK, o q é facilmente tratado no evento onreconcileerror do clientdataset, mas e a inserção na tabela de logs ? q ja ocorrera ?
Este é um assunto complicado e meu problema e outros ´empecilhos´ tem deixado a tecnologia Midas, na minha opinião muito aquem do q realmente é atribuido a ela.
Ficarei grato caso alguem possa esclarecer esta dúvida
PS: Deixo aqui uma solicitação aos editores da revista se possível formularem uma materia sobre este assunto (Transações em multi camadas), acho q será de grande utilidade a muitos.
Ederson Selvati
Volto a solicitar a ajuda de vcs sobre transações em aplicações multicamadas...
Estou com o seguinte problema:
Tenho o seguinte cenário:
BD -> Camada de Acesso -> Camada de apresentação
na camada de acesso, tenho o componente de conexao, query´s e dsp´s.
na camada de apresentação tenho os clientdataset´s q sao ligados aos providers, frente a isto, insiro, altero e excluo normalmente..
porém, estou implementando um log de usuarios, onde eu gravo tudo q o usuario fez, se incluiu, alterou, excluiu..etc
estou fazendo isto no evento beforeupdaterecord dos dsp´s na camada de acesso: ex.
procedure Tmeudm.dspbeforeupdaterecord... begin if updatekind=ukinsert then minhaqry.sql.add(´usuario inseriu´); else if updatekind=ukmodify then minhaqry.sql.add(´usuario alterou´); else if updatekind=ukdelete then minhaqry.sql.add(´usuario excluiu´); minaqry.execsql; end;
entao, toda vez q postar ou excluir um registro em um clientdataset na camada de apresentação, vou gravar um registro em uma tabelinha de logs, só q desta forma, eu corro risco de ter um log sem q o registro em questao tenha sido gravado ou excluido, pq o banco de dados ainda poderá me retornar erro como violação de PK ou FK, o q é facilmente tratado no evento onreconcileerror do clientdataset, mas e a inserção na tabela de logs ? q ja ocorrera ?
Este é um assunto complicado e meu problema e outros ´empecilhos´ tem deixado a tecnologia Midas, na minha opinião muito aquem do q realmente é atribuido a ela.
Ficarei grato caso alguem possa esclarecer esta dúvida
PS: Deixo aqui uma solicitação aos editores da revista se possível formularem uma materia sobre este assunto (Transações em multi camadas), acho q será de grande utilidade a muitos.
Ederson Selvati
Eselvati
Curtidas 0
Respostas
Orpolonio
22/08/2005
Sugestão....
Sua tabela de LOG não é regra de sistema certo?
Coloque em um trigger.
Digo para economizar codigo no RDM para metodos complexos.
Se quiser usar o commit,rollbabk basta criar um metodo
TRANSACAO(´COMMIT´)
TRANSACAO(´ROLLBACK´);
Dentro do metodo TRANSACAO vc faz normalmente como se estivesse escrevendo em duas camadas....
Sua tabela de LOG não é regra de sistema certo?
Coloque em um trigger.
Digo para economizar codigo no RDM para metodos complexos.
Se quiser usar o commit,rollbabk basta criar um metodo
TRANSACAO(´COMMIT´)
TRANSACAO(´ROLLBACK´);
Dentro do metodo TRANSACAO vc faz normalmente como se estivesse escrevendo em duas camadas....
GOSTEI 0
Eselvati
22/08/2005
Blz orpolonio, quer dizer entao q dentro da aplicacao cliente se eu chamar um metodo criado no rdm q faça por exemplo
se eu chamar estes metodos na aplicacao cliente
seria algo deste tipo ?
Vlw
Ederson Selvati
rdm.meumetoddeiniciartransacao var trans: ttransactiondesc begin trans.transactionid... minhaconexao.starttransaction(trans) end; rdm.meumetodoparacommit begin minhaconexao.commit(trans) end;
se eu chamar estes metodos na aplicacao cliente
procedure_tal begin meumetododeiniciartransacao; clientdataset1.insert; clientdataset1.pppppp clientdataset1.post; clientdataset2.delete; clientdataset3.edit; clientdataset3.pppppp clientdataset3.post; if clientdataset1.applyupdates(0)=0 then if clientdataset2.applyupdates(0)=0 then if clientdataset3.applyupdates(0)=0 then meumetododecommit else meumetododerollback; else meumetoderollback else meumetododerollback; end;
seria algo deste tipo ?
Vlw
Ederson Selvati
GOSTEI 0