Duvida com transacoes

4 respostas
S

Ola pessoal.

Estou com uma duvida que envolve transacoes em java.
Olha só tenho o seguinte modelo.

Servlet Chama negocios

  • Negocios executa minhas regras de negocio estando td de acordo chama persistence que vai executar uma acao x no db.
    Para persistir os dados estou usando hibernate, na minha classe generic DAO estou usando transacao e ta td ok.
    A minha duvida é:
Digamos que eu tenha o metodo um metodo qualquer que tenha varias acoes no db (que nao acesso diretamente, acesso persistence que chama meu genericDao).

Metodo

Acao1 XXPersistence.selId(id)

Acao2 XXPersistence.selNome(nome)

Acao1 XXPersistence.gravaSaldo(saldo)

Oque quero é garantir que todas estas acoes sejam executadas, só que estou em negocios.
Posso implementar transacao aki?

Acho q ta meio confuso …

4 Respostas

Kenobi

Silvio_java:
Ola pessoal.

Estou com uma duvida que envolve transacoes em java.
Olha só tenho o seguinte modelo.

Servlet Chama negocios

  • Negocios executa minhas regras de negocio estando td de acordo chama persistence que vai executar uma acao x no db.
    Para persistir os dados estou usando hibernate, na minha classe generic DAO estou usando transacao e ta td ok.
    A minha duvida é:
Digamos que eu tenha o metodo um metodo qualquer que tenha varias acoes no db (que nao acesso diretamente, acesso persistence que chama meu genericDao).

Metodo

Acao1 XXPersistence.selId(id)

Acao2 XXPersistence.selNome(nome)

Acao1 XXPersistence.gravaSaldo(saldo)

Oque quero é garantir que todas estas acoes sejam executadas, só que estou em negocios.
Posso implementar transacao aki?

Acho q ta meio confuso …

Transação realmente tem que ser demarcada em nível de negócio. Se ficar acoplada ao banco, você poderá ter problemas, como o citado. Não garantirás a atomicidade.

Para isso podes fazer de várias maneiras, mas já que está usando Hibernate, aconselho a olhar o Proxy de Transação do Spring. É muito fácil de configurar hoje em dia e possui Annotations, assim você poderá garantir o isolamento de transação da do ponto que demarcou entre outras features.

Fica a dica :-).

sergiotaborda

Silvio_java:
Ola pessoal.

Estou com uma duvida que envolve transacoes em java.
Olha só tenho o seguinte modelo.

Servlet Chama negocios

  • Negocios executa minhas regras de negocio estando td de acordo chama persistence que vai executar uma acao x no db.
    Para persistir os dados estou usando hibernate, na minha classe generic DAO estou usando transacao e ta td ok.
    A minha duvida é:
Digamos que eu tenha o metodo um metodo qualquer que tenha varias acoes no db (que nao acesso diretamente, acesso persistence que chama meu genericDao).

Metodo

Acao1 XXPersistence.selId(id)

Acao2 XXPersistence.selNome(nome)

Acao1 XXPersistence.gravaSaldo(saldo)

Oque quero é garantir que todas estas acoes sejam executadas, só que estou em negocios.
Posso implementar transacao aki?

Acho q ta meio confuso …

O papel do DAO ( assintomático de sindrome de DAO ou não ) nunca foi, nem será nunca o de controlar transações.
DAO que iniciam transações estão votados ao fracasso.
Transação é um conceito global. Alguem tem que a iniciar e controlar se deu certo. Esse alguem, normalmente é a classe de serviço, que vc chama de negoico.
Vc não vai implementar transação nessa classe, vc vai iniciar a transação. São coisas diferentes. O DAO vai usar a transação ativa no momento que ele for fazer as ações no banco.

Em ambiente JEE vc usa a interface UserTransaction para controlar a transação, ou usa mecanismo de anotação ou configuração para que o ambiente faça isso sozinho facilitando o sue trabalho. No caso de usar o hibernate vc precisa ter acesso à classe Transactino do ppr hibernate. Pode ser diretamente ou encapsulada em outro objeto.

Moral da historia, na sua classe de negocio vc precisa ter um codigo semelhante a este:

Transaction tansaction = ...  // obtem de alguam forma 
try {
   transaction.begin();
 
  // codigo de negocio

  transaction.commit();
} catch (Exception e){
  transaction.roolback();
  throw e;
}
alf_f2

É recomendável utilizar um recurso mais avançado de transação: EJB ou Spring
Assim vc poderá demarcar as transações:
Inicio - Faz um monte de coisas - Fim

Para que estes mecanismos funcionem sei que é necessário utilizar um driver de BD que seja XA

S

Valeu gente.

Neste caso vou ter que capturar a minha conexao na minha classe de negocios e no dao buscar esta transacao corrente.
Basicamente seria isto?

Criado 28 de agosto de 2008
Ultima resposta 28 de ago. de 2008
Respostas 4
Participantes 4