TransactionRequiredException não é disparado

4 respostas
fabiocsilva

No livro Enterprise Java Beans 3.0, da Oreilly, tem uma frase que tem sido enigmática pra mim: “TransactionRequiredException é lançada se esse método for invocado em um contexto de persistência com escopo de transação”. O método a que ele se refere é o persist. Na verdade alguns outros como o merge têm esse mesmo comportamento.

O problema é que eu não estou conseguindo simular o disparo dessa exceção. Pelo que entendi, o exemplo abaixo deveria disparar, supondo que o cliente chame o método setCabin:

@Stateful
public class TransactionPersistenceContextBean implements TransactionPersistenceContextRemote
{
    @PersistenceContext(unitName="titan")
    private EntityManager manager;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void setCabin(int pk)
    {
       Cabin cabin = manager.find(Cabin.class, pk);
       cabin.setBedCount(2);
       manager.merge(cabin);
    }
...
}

Tentei forçar a barra fazendo

Mas o código continuou executando sem problemas. Alguém pode me indicar como exatamente funciona essa exceção ?

4 Respostas

F

Então, essa anotação diz ao container que o método deve estar em um contexto de transação simplesmente, e que se algo der errado os conceitos aplicados a esse tipo de contexto deve ser acionados, exemplo é que você pode efeutar alguma modificação ao seu banco de dados e caso no final ocorra algum erro e feito um roll-back, simplesmente isso.
abs

rod

TransactionRequiredException so é lançado pelos metodos persist, merge, remove, refresh se for executado em um bean CMT sem contexto de transacao.
Essa exception tambem é lancada em metodos que utilizam o TransactionAttribute = MANDATORY e sao chamados em um contexto sem transacao.

fabiocsilva

rlazoti, então o correto seria “fora de um contexto de persistência com escopo de transação” ? E outra, o livro diz que é válido chamar o merge se for num contexto de persistência extendido… Tô com um nó na cabeça :stuck_out_tongue:
Tem como você postar um exemplo que dispara essa exceção? Do jeito que tá no livro tá meio genérico, não precisaria do TransactionAttribute = MANDATORY. Para quem tem o livro em português tá na página 52, na seção “Persistindo Entidades”. Tô com uma forte suspeita de um erro de tradução…

fabiocsilva

Galera, saquei o lance do TransactionRequiredException. Quando o cliente chama um método anotado com @Transactional, pode acontecer do método anular a transação aberta pelo cliente e/ou não abrir nenhuma transação. Isso depende do tipo de transação informado.

Vejam a figura abaixo:

Se, por exemplo, method-B estiver marcado como MANDATORY (conforme informado anteriormente) e A não estiver dentro de uma transação, B não tentará criar uma e a exceção será disparada.

Desculpem o tamanho da figura, não sei como diminuir…

Criado 11 de abril de 2009
Ultima resposta 14 de abr. de 2009
Respostas 4
Participantes 3