Atomicidade entre duas operações (Spring + JPA - createNativeQuery)

4 respostas
paulohbmetal

Olá pessoal, blz? Seguinte, estou com um problema me enchendo o saco aqui. :evil: Estou criando um aspecto para auditar operações de escrita no banco para todas as aplicações. Mas a única coisa que esta rotina faz é registrar o usuário da aplicação na sessão do banco e uma trigger existente nas tabelas pega esse usuário e faz o resto do serviço. Então, para registrar esse usuário no banco, chamo uma procedure com o createNativeQuery do JPA. O problema é que me parece que as operações estão sendo executadas em transações/conexões diferentes pois, quando a inclusão é feita, recebo uma exception falando que a trigger não encontrou o usuário registrado.

O método que é interceptado fica +/- assim:

@Transactional
public void incluir(Foo foo) throws Exception {
    //Aqui o aspecto é chamado e registra o usuário no banco, nomalmente.
    dao.incluir(foo);
}

O método do aspecto também está com o @Transacional (como o acima). Depurando o código, percebi que as operações estão sendo executadas em EntityManagers (instâncias) diferentes. É normal?

Bom, se quiserem mais detalhes, posso passar. Valeu!

4 Respostas

Hebert_Coelho

Pode ser pq a trigger está disparando antes da transação realizar o commit.

Você poderia iniciar uma nova transação para persistir apenas o dado necessário para a trigger, ao finalizar o método seria feito o commit e o restante do processo continuaria na mesma transação.

paulohbmetal

Cara, pode acreditar, vc acabou de fazer a boa ação do dia. Putz! Matou a pau!!!

Era isso mesmo!

paulohbmetal

Engraçado, a coisa parece que funciona para umas situações e para outras não. Entrei em contato com os BDA’s e me informaram que as solicitações (execução da procedure e insert) estão sendo executadas em connections diferentes. Estou achando muito sinistro. O aspecto que faz a auditoria está em um jar diferente, sabem se pode ocorrer algum problema com isso?

Valeu!

Paz e bem!

paulohbmetal

Galera, percebi que se retirar o

type = PersistenceContextType.EXTENDED

da declaração do EntityManager, tudo funciona numa boa mas, se colocar é problema na certa. A dúvida é se o EXTENDED estaria forçando a busca de uma nova conexão (que já foi confirmado pelos DBA’s).

Alguém mais já teve problema parecido?

Editado: Antes que me perguntem o EXTENDED está lá para evitar os famigerados LazyInicializationException…

Criado 4 de janeiro de 2012
Ultima resposta 1 de fev. de 2012
Respostas 4
Participantes 2