duvidas com transações - EJB  XML
Índice dos Fóruns » Java Enterprise Edition (Java EE)
Autor Mensagem
Sérgio Paulo
Thread.start()

Membro desde: 27/02/2005 20:58:10
Mensagens: 32
Offline

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?


gianbala
Smalltalk

Membro desde: 03/05/2006 18:46:08
Mensagens: 3
Localização: Mato Grosso - Brasil
Offline

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 ?

Gian - :>
[Email] [MSN]
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

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.

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
Sérgio Paulo
Thread.start()

Membro desde: 27/02/2005 20:58:10
Mensagens: 32
Offline

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();
}

}
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

Não faça commit manual. Após serem executados os métodos o container faz o commit.

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
Fabricio Cozer Martins
GUJ Ranger
[Avatar]

Membro desde: 08/05/2004 10:22:03
Mensagens: 935
Localização: Salvador/Brasil
Offline

Sérgio Paulo wrote:
[code]
public class ejb3{

op(){
ejb1.op();
ejb2.op();
op();
}

}

recursivo ?

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!

Fabrício Cozer Martins
Analista de Sistemas
Bacharel em Ciência da Computação da UFBa
Sun Certified Programmer for Java 2 Platform 1.4
Sun Certified Web Component Developer for J2EE 1.4
[MSN] [ICQ]
 
Índice dos Fóruns » Java Enterprise Edition (Java EE)
Ir para:   
Powered by JForum 2.1.8 © JForum Team