Commit no banco antes de finalizar transacao ejb

5 respostas
pugnator

é possível durante uma transacao ejb ser feito um commit no banco antes do termino da transacao ejb ?
cenário:
server A salva um cliente, gera um idcliente e envia para server B, onde consulta pelo idcliente recebido, e nao encontra o registro.

sempre que um registro é salvo no banco é gravado data/hora. Um sistema realiza um processo salva os registros no banco e envia uma mensagem jms para outro servidor com um id, onde é feita uma consulta no banco(o mesmo que foi salvo o registro anterior). Porém qdo é feita a consulta o registro nao é encontrado(noresultexception)

vendo os logs tenho
momento que gerou a excecao.
ex1:
log = 2013-03-26 13:57:03,639
banco = 2013-03-26 13:57:02.971675

ex2:
log = 16:29:55,768
banco = 16:28:20.453091

Dai fica minha dúvida, se o registro foi salvo no banco e a transacao no ejb ainda nao terminou.

5 Respostas

aluisiodsv

A transação existe exatamente pra controlar o que poderá ser feito rollback, ou seja, vc não vai conseguir comitar antes do fim da transação. (edit: aliás, o commit é feito na transação, indicando o seu fim)

O que poderia ser feito é um Observer que dispara um Event assim que o método terminar de executar e o método do observer manda a mensagem.

bombbr

Quando dentro de uma mesma transação no mesmo servidor ao inserir um registro o mesmo será encontrado por outro processo que o consultar. Já em servidores diferentes o registro só será encontrado quando a transação for finalizada e dado o commit.

Para tentar resolver seu problema você pode configurar o método que insere o registro com tipo de transação TransactionAttributeType.REQUIRES_NEW). Assim seu registro será “comitado” ao termino deste método.

aluisiodsv

Bem lembrado sobre comitar ao término deste método, porém caso o JMS seja mandado dentro deste EJB o problema vai continuar.

O REQUIRES_NEW só fará com que, caso algum outro método no EJB chame este método ele seja comitado independende do que acontecer com a outra transação, o que pode ser perigoso na maioria dos casos.

pugnator

valeu pessoal, vou tentar sugerir a questao do observer. Tendo em vista que sou responsavel pelo sistema do servidor B e o sistema do servidor A onde ta o problema é outra equipe. O questão é que o problema estoura aqui… heheheh

aluisiodsv

Ah tá, então não dá pra usar o observer, pois a solução seria na outra equipe.

Acho q se for garantido que qndo a mensagem é enviada foi realmente gravado os dados, dá pra fazer um loop de verificação, aguardando 500 ou 1000 ms a cada loop e limitando uma qnt de vezes para que caso tenha dado algum problema esse método não acabe com o processamento.

Criado 26 de março de 2013
Ultima resposta 27 de mar. de 2013
Respostas 5
Participantes 3