Nova transação usando seam

Pessoal,

O problema é o seguinte, estou utilizando o seam 2.1.2 e no meu negocio sempre que for lancada uma exceção no componente seam eu devo gravar um log no banco. So que devido ao seam gerenciar a transação, quando é lançada uma exception dentro do catch, a transação ja foi encerrada. Tem como eu gerenciar isso ou impedir de alguma forma que a transação somente seja encerrada apos a saida do método?

Entendo que no catch deva ser dado o rollback, mas encerrar a transação nao entendo porque, ela deveria ser encerrada na saida do método. Segue abaixo o erro que ocorre ao tentar gravar um registro na tabela de log:

11:29:43,976 WARN [JDBCExceptionReporter] SQL Error: 0, SQLState: null
11:29:43,976 ERROR [JDBCExceptionReporter] Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f57fee5:946:4ae1aa0c:139 status: ActionStatus.ABORT_ONLY >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f57fee5:946:4ae1aa0c:139 status: ActionStatus.ABORT_ONLY >)

OBS: nao tem problema de query nem de entidade pq o metodo funciona fora do catch.

segue trecho do codigo:

COMPONENT SEAM

[code]} catch (Exception e) {

		FacesMessages.instance().add(Token.ERRO_MSG_GENERICO + e.getCause());
		
		try{
			//gravando log da transação
			transacaoBean.gravaLog(transacao, StatusTransacao.ERRO, null);
		}catch(Exception eg){
			FacesMessages.instance().add(Token.ERRO_MSG_GENERICO_LOG + eg.getCause());
			return &quot;erro&quot;;
		}

} [/code]

MÉTODO QUE GRAVA O LOG:

[code]public void gravaLog(TransacaoNova transacaoNova, StatusTransacao eStatusTransacao, String msgErro) throws Exception {

	TransacaoNovaLog logTransacao = new TransacaoNovaLog();
	logTransacao.setDataLog(new Date());
	logTransacao.setTransacaoNova(transacaoNova);
	
	switch (eStatusTransacao){
		
		case CRIADA:
			logTransacao.setObservacao(&quot;transação criada com sucesso&quot;);
			logTransacao.setStatus('E');
			break;
		case PENDENTE:
			logTransacao.setObservacao(&quot;Falha ao enviar transação ao APLIC: &quot; + msgErro);
			logTransacao.setStatus('P');
			break;
		case SUBMETIDA:
			logTransacao.setObservacao(&quot;Transação submetida com sucesso&quot;);
			logTransacao.setStatus('S');
			break;
		case FINALIZADA:
			logTransacao.setObservacao(&quot;Transação finalizada com sucesso&quot;);
			logTransacao.setStatus('F');
			break;
		case CANCELADA:
			logTransacao.setObservacao(&quot;Transação cancelada&quot;);
			logTransacao.setStatus('C');
			break;
		case ERRO:
			logTransacao.setObservacao(&quot;falha na transação: &quot; + msgErro);
			logTransacao.setStatus('R');
			break;
	}
	
	em.persist(logTransacao);
	
}[/code]

Obrigado!!

Oi Malachai!

Vocë conseguiu resolver este problema?
Estou com um problema muito parecido com este e ainda não consegui achar uma solução.
Na verdade é um processo de exclusão, quando há alguma constraint eu faço uma exclusão lógica, tudo no mesmo método.
Quando a remoção dá erro logo depois tento fazer o update e estoura a exceção “Transaction is not active”

Se tiver alguma pista/dica…

[]'
Fábio Viana

Tambem estou com problema semelhante…