Arquitetura de uma aplicação WEB + MVC + Frameworks action-based

[quote=renanreismartins]
aleck, valeu cara. Que abordagem voce utiliza com relaçao as transacoes ?
abrasss a tds[/quote]

Em sistemas pequenos o uso de transação é mínimo, quando preciso costumo implementar userTransaction.

Se userTransaction não atender então é hora de pensar em outra arquitetura, pois as coisas já estão ficando complicadas.

Isto sugere a velha resposta “Depende!”.

Vejo problemas se:

  1. Suas actions estão redundantes em função do seu controle de transação.
  2. O código nas suas actions está muito complexo por conta da construção do fluxo da transação.
  3. Os mesmos serviços ou diferentes combinações de serviços serão utilizados por outro tipo de tecnologia (web services, rmi, componentes de integração, etc…)

Por isso sugeri que vc utilizasse algum componente para lhe ajudar, porque na maioria das situações fica difícil de vc prever quais / como serão as transações que irão surgir pela frente.

P.S Controle de transações não é um assunto trivial (na minha opinião).

flws

Na grande maioria dos casos controle de transação é algo totalmente trivial, pois tudo que vc precisa e deseja é ter uma action atômica. Não há porque complicar isso.

No Mentawai, por exemplo, tudo que vc tem que fazer é aplicar um TransactionFilter (filtro de transação) na sua action. Ele fará com que sua action seja atomica, dando commit se ela retornar SUCCESS ou rollback se retornar outra coisa ou exception.

[quote=saoj]Na grande maioria dos casos controle de transação é algo totalmente trivial, pois tudo que vc precisa e deseja é ter uma action atômica. Não há porque complicar isso.

No Mentawai, por exemplo, tudo que vc tem que fazer é aplicar um TransactionFilter (filtro de transação) na sua action. Ele fará com que sua action seja atomica, dando commit se ela retornar SUCCESS ou rollback se retornar outra coisa ou exception. [/quote]

hahahahahah!

Lógico…quando vc tem um componente ou um framework que faz o serviço sujo obviamente que fica trivial né!?

Não estudei o Menta prá dizer se o controle de transações é bom e aguenta o tranco. Mas imagino que sim, quando li sobre ele na revista Java Magazine o Mundo OO (não lembro agora) me passou uma boa impressão.

Se o autor do post puder utiliza-lo neste problema talvez seja a melhor resposta, quem sabe até o VRaptor seja também uma opção.

Parabéns a equipe do Menta.

flws

Via filtros (ou interceptors) a coisa fica interessante. Mas o framework tem que ser full-stack para atacar todas as partes do problema.

A sequencia no Mentawai é o seguinte:

  1. Filtro de Conexão pega uma connection do pool e coloca disponível para a action no Input. Note que vc não precisa se preocupar em devolver a conexao para o pool (try / finally) pois o filtro garante isso pra vc.

  2. A action então pega essa connection e faz o que quiser. Vai em várias tabelas e faz INSERT / UPDATE / DELETE.

Aí vc pensa. No passo 2) eu preciso que haja uma transação ou seja, se falhar o insert na última tabela eu quero dar um rollback nas alterações. Então como vc faz?

1.5) Aplica um filtro de transação na action. O que ele faz? Ele pega a connection que está no Input (passo 1), dá um setAutoCommit(false) e espera a execução da action. Se a action retorna SUCCESS ele chama commit e volta com o valor antigo do setAutoCommit. Se a action dá uma exception ou retorna outra coisa que não SUCCESS ele dá um rollback e volta com o valor antigo do setAutoCommit. Vc tb pode configurar outros valores além do SUCCESS para o commit acontecer.

Feito isso vc tem uma action atomica, ou seja, ou toda ela executa ou nada executa. Isso é o que vc precisa na grande maioria dos casos, eu diria em 95% dos casos. Claro que podem existir casos mais complicados com dois bancos de dados (duas connections diferentes), two-phase commit, etc. mas eu sinceramente, em todos os projetos webs que fiz, nunca me deparei com uma situação que necessitasse de um esquema mais complicado.

Mais uma vez: não que a situação mais complexa não existe. Ela existe sim, mas é exceção, é rara, mas mesmo assim tem gente que usa bazooka para matar mosca quando o assunto é controle transacional.

Muito interessante, o filtro, mas e se no caso eu nãp quiser o Filtro de transação em todo a minha action, tipo dentro da action só tenho uma innerAction, que precise de transação como faria?
Tem como aplicar o filtro de transação somente em uma innerAction?

Atualmente, estou trabalhando com JSF, e não quero usar o Spring(não gosto) para controlar transações, então estou desenvolvendo, um filtro de transações com base em Annotations, semelhante a este do Mentawai.

vc pode configurar um filtro como global, de uma action (classe inteira, isto eh, metodo execute e todas as inner actions) ou apenas de uma inner action.

http://www.mentaframework.org/inneraction.jsp?loc=pt