Problema de transação com Filtro no JSF

Galera, estou com um problemão e gostaria de uma ajuda.
Estou desenvolvendo uma aplicação com JSF, Primefaces e Hibernate. Essa aplicação possui o seguinte requisito: “Após a confirmação do primeiro pagamento de um contrato, o contrato é ativado”. Implementei um Filter para que a transação fosse iniciada a cada requisição, mas quando possuo mais de uma presistência na transação, se a segunda falhar, o sistema retorna pro filtro e executa o commit e não o rollback.

Coloco abaixo os códigos.

Filtro

package hibernate.utils;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.hibernate.SessionFactory;


public class ConexaoHibernateFilter implements Filter {

	private SessionFactory sessionFactory;
	
	@Override
	public void destroy() {
		
	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
			FilterChain chain) throws IOException, ServletException {

		sessionFactory.openSession();
		
		try {
			
			sessionFactory.getCurrentSession().beginTransaction();
			
			chain.doFilter(servletRequest, servletResponse);
			
			if (sessionFactory.getCurrentSession().getTransaction().isActive()) {
				sessionFactory.getCurrentSession().getTransaction().commit();
			}
			
		} catch(Throwable ex) {
			
			try {
				
				if (sessionFactory.getCurrentSession().getTransaction().isActive()) {
					sessionFactory.getCurrentSession().getTransaction().rollback();
				}
				
				
			} catch(Throwable t) {
								
				t.printStackTrace();
				
			}
			
			throw new ServletException(ex);
			
		} finally {
			
			sessionFactory.close();
			
		}
		
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {

		sessionFactory = HibernateUtil.getSessionFactory();
		
	}

}

Método confirmarPagamento do meu ManagedBean

	public void confirmarPagamento() {	

		try {
			
			PagamentoProcesso pagamentoProcesso = PagamentoFactory.criarPagamentoProcesso(ContextoUtils.getParametroGlobal());
			
			pagamentoProcesso.confirmarPagamento(this.pagamentoSelecionado);
			
			ExibeMensagem.exibirMensagemOK("Pagamento confirmado com sucesso");

		} catch(Exception e) {
			
			ExibeMensagem.exibirMensagemErro(e.getMessage().split(System.getProperty("line.separator")));

		}

	}

Métodos envolvidos da minha classe PagamentoProcesso

	public void confirmarPagamento(Pagamento pagamento) throws Exception {
		
		this.pagamentoBusiness.confirmar(pagamento);
		
		ativarContratoSeForOPrimeiroPagamento(pagamento);
		
		if (this.envioDeEmailHabilitado) {
		
			enviarEmailDeConfirmacaoDoPagamento(pagamento);
			
		}
						
	}

	private void ativarContratoSeForOPrimeiroPagamento(Pagamento pagamento)
			throws Exception {
		
		// Se for o primeiro pagamento do contrato, ativa o contrato
		Contrato contrato = pagamento.getContrato();
		
		Pagamento primeiroPagamentoDoContrato = contrato.getPagamentos().get(0); 
		
		boolean ehPrimeiroPagamentoDoContrato = pagamento.equals(primeiroPagamentoDoContrato);
		
		if (ehPrimeiroPagamentoDoContrato) {
			
			ativarContrato(pagamento.getContrato());
			
		}
		
	}

	private void ativarContrato(Contrato contrato) throws Exception {

		ContratoProcesso contratoProcesso = ContratoFactory.criarContratoProcesso(this.parametroGlobal);
		
		contratoProcesso.ativarContrato(contrato);
				
	}