Objetos Transacionais em Java

Postado em

Se você foi como muitas crianças, passou muitos momentos despreocupados no playground, andando de balanço, passando pelas barras do trepa-trepa, ficando tonto ao girar no carrossel e indo para cima e para baixo numa gangorra. O problema dela é que é impossível aproveita-lá sozinho. Veja que na verdade, para realmente usá-la, sempre necessitará de outra pessoa. Você e um amigo têm que concordar em andar na gangorra. Esse acordo é uma proposição tudo-ou-nada. Ambos têm de andar ou nenhum dos dois irá andar. Se qualquer um de vocês falhar em sentar no seu respectivo lugar em cada ponto do banco, não poderão se divertir – só haverá uma criança sentada em uma das pontas triste e imóvel. Spring in Action

111-mecpEm software, estas operações “tudo-ou-nada” são chamadas Transações que permitem agrupar diversas unidades operacionais numa única unidade de trabalho que ou acontece plenamente em sua totalidade, ou não. Segue um resumo com seus respectivos links apresentando uma série de sugestões referentes às estratégias, das mais simples a mais automatizadas de como desenvolvedores java podem implementar objetos transacionais em suas aplicações.

1. Manual

1.1 JDBC puro, usando diretamente a implementação da Connection do determinado provedor.

O JDBC especificou um método chamado setAutoCommit() para o que programador tenha a liberdade de configurar como será o controle das transações. A ausência da configuração expressa que comportamento é automático com o setAutoCommit(true) fazendo qualquer operação no SGDB, seja aberta e fechada a transação. Com a configuração do setAutoCommit(false), fica na responsabilidade do programador fazer as operação no SGDB e assim finalizar com o commit ou roolback.

1.2 Propagação da implementação do tópico 1.1 através de herança ou agregação.

A opção 1.1 acaba ficando muito trabalhosa, repetitiva e desorganizada quando começa a ser espalhada pela a implementação do sistema, dependendo do tamanho do aplicativo. Com isso, o ideal seria idealizar alguma forma de propagar este código trabalhoso e repetitivo. Reutilização em OOP é feita de duas formas: Herança ou Agregação. Então, a dica seria criar super-classes ou classes agregativas que encapsulem esse determinado código para que possam ser reutilizados nestes pontos do sistema.

1.3 Propagação da implementação do tópico 1.1 usando abordagem atributos estáticos em threads com a classe ThreadLocal.

O cenário de conexão e transação com SGDB é comumente vinculado com a ocorrência de threads do sistema, sendo que na execução do aplicativo irão acontecer processos concorrentes fazendo diversas operações e transações na base de dados (cenário muito comum em aplicativos web JEE) . Uma forma profissional de se resolver o caso é usando a classe ThreadLocal que permite ao programador criar e amarrar atributos estáticos por pilhas de thread, sendo assim a solução ideal para o controle de transações amplamente usado por reconhecidos frameworks de persistência existentes no mercado.

1.4 Implementação com o padrão Proxy [GOF] para controle das transações.

Uma possível abordagem para se lidar com as transações em java é a utilização do padrão Proxy que providencia uma mecânica bastante interessante, onde pode ser desenvolver uma falsa camada polimórfica que intermediará e controlará as transações nas chamadas para as operações transacionais. O conceito é utilizado por muitos frameworks tops da atualidade.

1.5 Implementação de uma camada DAO

Dependendo do tamanho da aplicação, é recomendado que se faça uma camada lógica totalmente separada para a implementação dos códigos relacionados com qualquer operação com o SGDB. Ou seja, qualquer coisa relacionada com conexão, transações e SQL pode ser separada de toda a aplicação promovendo uma índice de reutilização, organização e desacoplamento. É isso que justamente o padrão jee DAO sugere. Nele podemos encontrar todas as diretrizes para se implementar essa camada.

1.6. Utilizando frameworks ORM.

Os frameworks ORM são as últimas novidades da engenharia de software que se propõe a fazer com que uma aplicação programada em OO possa se comunicar como um SGDB de forma OO. E dentro deste contexto, as transações podem ser semi-automatizadas, dependendo de uma série de configurações que podem ser customizadas para cada tipo de aplicativo.

2. Automático

2.1 AOP com AspectJ

Programação orientada a aspectos AOP é o paradigma de programação com o objetivo de complementar a OOP. Com ela podemos facilmente acrescentar a transação como aspectos, construindo “advices” que controlaram as transações em determinados objetos. Vejam um exemplo na java Magazine Edição 60

2.2 Spring Framework

Umas das formas mais utilizadas da atualidade é a utilização do framework spring para o controle das transações de um aplicativo java. Nele podem ser encontrados uma série de recursos em diferentes níveis para se obter recurso de forma declarativa e modular. Segue o link para o tutorial de Gerenciamento de Transações.

2.3 Usando componentes JEE – Enterprise JavaBeans

Outro framework amplamente usado na atualidade é o EJB que também possui um módulo de controle de transações que podem ser agregadas na aplicação. Veja as referências para alguns ótimos livros de EJB.

Neste post não foi apresentando nenhum exemplo ou modelo de implementação justamente pelo fato de existirem inúmeras e diferentes formas de implementar ou de usar qualquer uma das dicas acima citadas, ficando a cargo do responsável pelo software entrar em detalhes implementacionais das opções e selecionar aquela que lhe caiba melhor em suas necessidades. Me coloco à disposição para qualquer tipo de ajuda. Aquele forte abraço e a paz.

“Todavia eu me alegrarei no SENHOR; exultarei no Deus da minha salvação.” Habacuque 3:18.