Controle de transação entre duas bases distintas  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
osmio
Java Ninja

Membro desde: 22/08/2006 20:27:54
Mensagens: 252
Offline

Boa tarde galera!

To passando por sérios apuros aqui!!
Gostaria de algumas sugestões e opiniões de vocês.

O problema é o seguinte:
Tenho duas bases de dados distintas e um processo batch que captura alguns dados da base X, consolida e insere na base Y.

Bom, quanto a isso, nenhum problema, desde que as duas bases estejam no ar e operando normalmente.
O problema maior é que eu tenho que garantir a consistência dos dados em ambos os lados, ou seja, eu pego alguns registros na base X e insiro na base Y e como resultado a inserção na base Y, eu atualizo alguns campos na base X.

Como eu poderia garantir a consistência dessas transações, uma vez que dependo do acesso a rede e de máquinas e bases diferentes?

At

"O pensamento lógico pode levar você de A a B, mas a imaginação te leva a qualquer parte do universo."
- Einstein, Albert
[Email]
kinow
JavaGuru
[Avatar]

Membro desde: 17/03/2005 14:49:18
Mensagens: 217
Localização: São Paulo
Offline

Bom,

vamos começar um Brainstorming aqui então

Se o seu processo Batch for em Java, pode fazer de forma "sincronizada", em cima de uma chave comum nas duas tabelas.

Você cria uma chave do tipo TRANSACTIONID. E o Batch inicia uma Thread para cada transação.

Não poderia ser assim?
[WWW] [Yahoo!] [MSN] [ICQ]
InsanelyTotalMac
Thread.start()

Membro desde: 10/11/2008 09:34:05
Mensagens: 28
Offline

osmio wrote:Boa tarde galera!

To passando por sérios apuros aqui!!
Gostaria de algumas sugestões e opiniões de vocês.

O problema é o seguinte:
Tenho duas bases de dados distintas e um processo batch que captura alguns dados da base X, consolida e insere na base Y.

Bom, quanto a isso, nenhum problema, desde que as duas bases estejam no ar e operando normalmente.
O problema maior é que eu tenho que garantir a consistência dos dados em ambos os lados, ou seja, eu pego alguns registros na base X e insiro na base Y e como resultado a inserção na base Y, eu atualizo alguns campos na base X.

Como eu poderia garantir a consistência dessas transações, uma vez que dependo do acesso a rede e de máquinas e bases diferentes?

At


Se o processo for feito em uma tacada só, de uma vez, basta controlar com flags... do tipo erro = false; (putz) rsss...

Se o primeiro processo de leitura der tudo certo, erro = false; senao erro = true; e se erro = true, aborta tudo...

Se o segundo passo do processo (gravar na base Y) der certo erro = false; senao erro = true e aborta o ultimo passo.

Entendeu ?
peczenyj
Moderador
[Avatar]

Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline

Vc não poderia fazer transações compensatórias?

http://pacman.blog.br

'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.'
[WWW]
osmio
Java Ninja

Membro desde: 22/08/2006 20:27:54
Mensagens: 252
Offline

Bom, vou tentar dar uma resposta aqui que compense todas as opiniões:

O que acontece hoje:

Se o commit na base Y for realizado corretamente, eu comito na base X, se o comiit na base X for executado corretamente, tudo foi perfeito, lindo, maravilha, mantive meu emprego!!!


Vamos fazer algumas suposições do mundo real:


Nesse caso OK, o commit na base X espera a garantia de que o commit na base Y tenha sido feito. Caso o commit na base Y nao tenha sido efetuado, eu utilizo o rollback() de ambas as bases, garantindo assim a consistência.

Agora, imagine a situação:
commit() na base Y efetuado corretamente, e o commit() na base X desceu o penhasco com uma SQLException nas costas!!!!

O que fazer nesse caso?
poderia dar o rollback() em ambos os casos como feito anteriormente, porém a base Y já efetuou o commit(), e queiramos ou não isso é irremediável!!!!

O que fazer agora?
Tenho um monte de registros inconsistentes na base Y, e isso prezados, não é bom pra ninguém!!!


At.

"O pensamento lógico pode levar você de A a B, mas a imaginação te leva a qualquer parte do universo."
- Einstein, Albert
[Email]
osmio
Java Ninja

Membro desde: 22/08/2006 20:27:54
Mensagens: 252
Offline

peczenyj wrote:Vc não poderia fazer transações compensatórias?


Tem um exemplo de como isso poderia ser feito?

"O pensamento lógico pode levar você de A a B, mas a imaginação te leva a qualquer parte do universo."
- Einstein, Albert
[Email]
osmio
Java Ninja

Membro desde: 22/08/2006 20:27:54
Mensagens: 252
Offline

kinow wrote:Bom,

vamos começar um Brainstorming aqui então

Se o seu processo Batch for em Java, pode fazer de forma "sincronizada", em cima de uma chave comum nas duas tabelas.

Você cria uma chave do tipo TRANSACTIONID. E o Batch inicia uma Thread para cada transação.

Não poderia ser assim?


Essa é "mais-ou-menos" a maneira como está implementada a solução hoje. O problema todo esta na consolidação (o processamento batch) ser realizado anteriormente à obtenção do TID.

E confesso-lhe com segurança que isso esta errado, muito errado!!!
rsrs

At.
[Email]
InsanelyTotalMac
Thread.start()

Membro desde: 10/11/2008 09:34:05
Mensagens: 28
Offline

osmio wrote:Bom, vou tentar dar uma resposta aqui que compense todas as opiniões:

O que acontece hoje:

Se o commit na base Y for realizado corretamente, eu comito na base X, se o comiit na base X for executado corretamente, tudo foi perfeito, lindo, maravilha, mantive meu emprego!!!


Vamos fazer algumas suposições do mundo real:


Nesse caso OK, o commit na base X espera a garantia de que o commit na base Y tenha sido feito. Caso o commit na base Y nao tenha sido efetuado, eu utilizo o rollback() de ambas as bases, garantindo assim a consistência.

Agora, imagine a situação:
commit() na base Y efetuado corretamente, e o commit() na base X desceu o penhasco com uma SQLException nas costas!!!!

O que fazer nesse caso?
poderia dar o rollback() em ambos os casos como feito anteriormente, porém a base Y já efetuou o commit(), e queiramos ou não isso é irremediável!!!!

O que fazer agora?
Tenho um monte de registros inconsistentes na base Y, e isso prezados, não é bom pra ninguém!!!


At.


Se você deu o commit na base Y chora !!!! Com o controle transacional "clássico" o dado já está lá... você poderia logar tudo o que foi feito em Y e utilizar o recurso de "desfazimento", mas ai teria que ser feito na mão...
peczenyj
Moderador
[Avatar]

Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline

osmio wrote:
peczenyj wrote:Vc não poderia fazer transações compensatórias?


Tem um exemplo de como isso poderia ser feito?


Acompanha essa Thread e pesquisa um pouco.
http://www.guj.com.br/posts/list/30/23150.java

Nunca implementei transações compensatórias de fato, portanto posso dar pouco apoio técnico, mas basta ter uma fonte...

http://pacman.blog.br

'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.'
[WWW]
osmio
Java Ninja

Membro desde: 22/08/2006 20:27:54
Mensagens: 252
Offline

InsanelyTotalMac wrote:
Se você deu o commit na base Y chora !!!! Com o controle transacional "clássico" o dado já está lá... você poderia logar tudo o que foi feito em Y e utilizar o recurso de "desfazimento", mas ai teria que ser feito na mão...



Ai é que esta mais um problema.
Poderia ter uma rotina de "exclusão" dos registros inseridos. Porém, não tenho garantia se o registro foi, de fato, inserido ou se foi atualizado.

Isso porque em tempo de execução ele verifica se já existe um registro compatível com o que esta sendo inserido. Se existe, atualiza. Se não existe, insere.

Portanto, a técnica de reversão fica muito mais complicada de se implementar do que imaginar.

At.

"O pensamento lógico pode levar você de A a B, mas a imaginação te leva a qualquer parte do universo."
- Einstein, Albert
[Email]
jgbt
GUJ Master
[Avatar]

Membro desde: 04/06/2003 15:01:48
Mensagens: 1286
Localização: Porto Alegre/RS
Offline

Acho que no seu caso a melhor opção seria JTA com Two Phase Commit.
Nunca precisai implementar, portanto não sei o nivel de trabalho/dificuldade, mas pelo que ja li a respeito deve resolver o seu problema.

[]´s

João Bier
Desenvolvedor Java
[Email]
kinow
JavaGuru
[Avatar]

Membro desde: 17/03/2005 14:49:18
Mensagens: 217
Localização: São Paulo
Offline

São duas tabelas no mesmo banco? É oracle?
[WWW] [Yahoo!] [MSN] [ICQ]
bruxel
JavaTeenager
[Avatar]

Membro desde: 28/12/2006 12:00:59
Mensagens: 175
Localização: Colinas/RS
Offline


InsanelyTotalMac



só para não ficar estranho, não há necessidade de comparar valores booleanos

This message was edited 1 time. Last update was at 11/11/2008 15:42:20


Bruxel, Alexsandro
Bal. Administração, com Análise de Sistemas
[MSN]
kinow
JavaGuru
[Avatar]

Membro desde: 17/03/2005 14:49:18
Mensagens: 217
Localização: São Paulo
Offline

bruxel wrote:

InsanelyTotalMac



só para não ficar estranho, não há necessidade de comparar valores booleanos



Acho que ele não pode fazer desta maneira porque precisa garantir que as duas funcionarão ou nenhuma funcionará. Não pode ocorrer casos em que Y funcione e X não. Mas issio ele pode confirmar melhor.

Bruno P. Kinoshita
http://www.kinoshita.eti.br
http://www.tupilabs.com
[WWW] [Yahoo!] [MSN] [ICQ]
osmio
Java Ninja

Membro desde: 22/08/2006 20:27:54
Mensagens: 252
Offline

bruxel wrote:

só para não ficar estranho, não há necessidade de comparar valores booleanos



Opa! To sabendo disso desde os primordios!!!

Coloquei assim pra ficar bem claro o que eu estava detalhando.

At.

"O pensamento lógico pode levar você de A a B, mas a imaginação te leva a qualquer parte do universo."
- Einstein, Albert
[Email]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team