Controle transacional de chamadas de Procedures?

3 respostas
robinsonbsilva

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.

3 Respostas

esmiralha

Não lembro se passei por uma situação parecida, mas vou tentar ajudar.

Uma procedure não executa automaticamente em uma nova transação. Se bem entendi seu código, cada chamada vai executar em uma mesma transação demarcada pela sessão Hibernate. Se você precisar comitar entre uma chamada e outra, talvez seja necessário faze-lo através da sessão Hibernate ou colocar um commit dentro da procedure.

robinsonbsilva

Boa tarde esmiralha,

Vou entrar em contato com o DBA, e confirmar se as Procedures em questão já tem o controle transacional interno.
Pela aplicação(java), posso afirmar que não há, ainda.

public void metodoQueExecutaProc1()() throws DAOException {  
  
	try {  
		Session hiberSession = getSession();  
		Connection con = hiberSession.connection();  
		CallableStatement call = con.prepareCall("{call pr_Proc1()}");  
  
		call.execute();

		/*Seria correto isso para controlar a transação??*/
               con.commit();

		call.close();  
	}catch (SQLException e) {  
		throw new DAOException(e);  
	}finally {  
		closeSession();  
	}  
}
robinsonbsilva

Problema resolvido,

Na proc não havia controle transacional!

Criado 5 de outubro de 2012
Ultima resposta 5 de out. de 2012
Respostas 3
Participantes 2