Bom dia,
Gostaria muito de uma ajuda para resolver um problema que tenho enfrentando.
Na aplicação que trabalho, existe uma rotina de pagamento e outra rotina de estorno de pagamento.
Basicamente são jobs executados pelo quartz, e a estrutura dessas rotinas é assim:
public void pagto(){
try {
metodoQueExecutaProc1();
metodoQueExecutaProc2();
metodoQueExecutaProc3();
metodoQueExecutaProc4();
}catch (Exception e) {
...
}
}
public void estornoPagto() {
try {
metodoQueExecutaProc1();
metodoQueExecutaProc2();
metodoQueExecutaProc5();
metodoQueExecutaProc6();
}catch (Exception e) {
...
}
}
Esses métodos nada mais faz do que executar algumas procedures.
As rotinas devem ser executadas “necessáriamente” nessa ordem:
pagto();
estornoPagto();
Ou seja, a pagto() deve estar concluida para chamar a estornoPagto(), debugando o sistema vi que essa ordem é respeitada, mas mesmo o fluxo seguindo corretamente, após executar estornoPagto()
os dados de estornos ficam errados.
Ai fiz um teste diretamente no banco de dados, simulando a execução dos métodos:
--pagto
exec Proc1;
exec Proc2;
exec Proc3;
exec Proc4;
--estorno
exec Proc1;
exec Proc2;
exec Proc5;
exec Proc6;
E tudo ficou perfeitamente correto.
os métodos que executam a proc segue esse modelo:
public void metodoQueExecutaProc1()() throws DAOException {
try {
Session hiberSession = getSession();
Connection con = hiberSession.connection();
CallableStatement call = con.prepareCall("{call pr_Proc1()}");
call.execute();
call.close();
}catch (SQLException e) {
throw new DAOException(e);
}finally {
closeSession();
}
}
O sistema é desenvolvido usando Websphere 6, hibernate 3, EJB 2.
Todo controle transacional é feito pelo EJB, e nesse caso como há apenas chamadas para as procedures, creio eu que todo controle transacional fica na procedure e uma vez que executou tal procedure, a mesma “ja foi comitada”, mas pelos resultados obtidos pelo estornos, dá para afirmar que as transações referentes ao pagamento ainda não foram comitadas completamente.
Desde já agradeço a atenção.