Current transaction is aborted

3 respostas
spranta

Pessoal, estou com um erro grave em um aplicação que está em produção, é um sistema de noticias de um portal, acontece que por vezes a aplicação gera um erro durante seu processamento, um erro por exemplo de acesso ao banco de dados ao buscar uma notica, no entanto, a partir dai, de um primeiro erro, a aplicação começa a ficar super instavel, não carregando mais todas as noticias para o site, carrega alguma e outras ela lança uma exceção sempre baseada na seguinte causa:

Uso hibernate
Alguém imagina o que pode estar vindo a acontecer, acreditava eu que possivelmente ao gerar este primeiro erro eu nao estava dando um commit ou roolback na transação, no entanto, eu tenho um filter para toda a aplicação que garante que que uma dessas operações sejam executadas, conforme voces podem ver abaixo:

//controlando transação
        Session session = null;
        Transaction tx = null;
        try {
        	if (request instanceof HttpServletRequest){
				session = GenericHibernateDAO.getInstance().getSession();
	            tx = session.beginTransaction();
	            logger.debug("Iniciando Transação");
	            request.setAttribute("HibernateTransaction", tx);
	            request.setAttribute("HibernateSession", session);
	            
	            
        	}
        	
		chain.doFilter(httpServletRequest, response);

		} catch (Exception e) {
			tx.rollback();
		}finally{
			try {
		        if(!tx.wasRolledBack())
		        	tx.commit();
			GenericHibernateDAO.getInstance().closeSession();
			} catch (HibernateException e) {
				e.printStackTrace();
			}
		}

Alguem imagina o que pode ser?

3 Respostas

M

Cara estou exatamente com o mesmo problema, tu já encontrou alguma solução?? Abraços

leoramos

Cara, fiquei curioso a respeito do problema, e decidi dar uma vasculhada na net.
O que vi, pelo menos, é que você deveria criar SavePoints ANTES da query executar.
Dessa forma:

String savepointName = "any string"+class.hasCode(); Savepoint savePoint = conn.setSavepoint(savepointName); try { stmt.execute(); success = true; } catch (SQLException sqle) { conn.rollback(savePoint); }

O código não é meu, peguei do exemplo. Dá uma fuçada, que é por aí o caminho.
E não esqueça de liberar seus recursos no finally :wink:

M

Ola amigo, obrigado pelo interesse. Bom, aqui na minha aplicação esse erro acontecia direto, eu consegui da uma amenizada dando um flush na sessao apos o termino, resolveu por um tempo mais voltou a aparecer, nao com muita frequencia, mais aparecia. Ai eu fui tentar ver se conseguia replicar o erro, e consegui. Ai pesquisando um bocado, eu descobri que o C3P0(Gerenciador de pool de conexoes) resolve varios problemas desse tipo, eu coloquei ele para gerenciar as conexoes do hibernate e funcionou, ate agora nao tive mais esse problema nem consegui replicar. Entao pra galera que ta tento esse problema, procurem como colocar o C3P0 como gerenciador de conexoes do hibernate, acredito que va resolver pra vocês tambem, assim como eu acredito que resolveu pra mim, so a longo prazo que vou ter certeza. Abraços

Criado 18 de maio de 2007
Ultima resposta 1 de set. de 2009
Respostas 3
Participantes 3