Pessoal estou aprendendo j2ee e tenho uma duvida com relação ao controle de trasação.
Imagine que vc tem um EJB1 que chama um DAO para realizar um insert em uma tbl e esse DAO usa o data source e commita a operação. Um outro EJB2 tem o mesmo comportamento. Se eu invocar um metodo do EJB3 que chama um metodo do EJB1 e EJB2, o controle de transação fica garantido? Se o metodo do EJB2 falhar as alterações feitas pelo EJB1 serão desfeitas?
Duvidas com transações - EJB
5 Respostas
tente fazer o commit no EJB3
eu tava justamente com esse problema ontem mas não estava usando o EJB então fiz o commit/rollbak pela camada facade, ou seja antes da DAO.
Não sei se t ajudei ?
Deixa eu ver se entendi:
Você tem a sequência de fluxo:
EJB1 -> EJB2 -> EJB3
E quer saber se EJB2 falhar as modificações em EJB1 serão desfeitas.
Depende de como está organizada sua transação. Se você configurou seus EJBs para atuarem numa única transação (atributo Required, por exemplo), sim, se não o EJB2 pode executar uma transação paralela e independente.
Normalmente se usa ‘required’, então geralmente este rollback é feito.
Eu coloquei como required, mas mesmo assim a transação não fica garantida. Acho que talvez a forma com que o DAO esta escrito está errada pois cada DAO recupera uma conexão do data source e faz um commit independente. Se isso for verdade onde deveria estar o connection.commit?
Só pra esclarecer um pouco a estrutura é assim:
[code]
public class ejb3{
op(){
ejb1.op();
ejb2.op();
op();
}
}
Não faça commit manual. Após serem executados os métodos o container faz o commit.
[code] public class ejb3{ op(){ ejb1.op(); ejb2.op(); op(); }}
recursivo ? :shock:
Bem, existem algumas diretivas quanto a utilização de transação no EJB, como foi citado pelo Phillip, além da Required, exite ainda RequiresNew sempre abre uma nova transação, suspendendo alguma que já existe), NotSupported (não exige transação nenhuma, executa no contexto não transacional ), Supports, Mandatory, e Never.
Me diz uma coisa, quais são os tipos de EJB ? Entity, Session ?
Pq vc pode criar um Session Façade , que determina a sequencia de operações são executadas, não gosto muito desse tipo de implementação, mas é uma saída, aí nesse Session você controla a transação, caso dê alguma exceção você dá um rollback, dessa forma deixe o tipo como Required, funciona blza!