Pular para o conteúdo principal

Gerenciamento de Transações com EJB - Parte 1

Olá pessoal, hoje iremos abordar um assunto muito importante dentro do mundo de aplicativos corporativos, que é o gerenciamento de transações.

Todo sistema de informação pode ter ou não necessidades de contextos transacionais, a adição de transações depende muito dos requisitos do sistema.

O que é uma Transação ?

O conceito de transação é muito amplo e possui várias definições,  uma transação é quando precisamos garantir que algumas operações que façam parte de um mesmo contexto sejam executadas em conjunto, assim é possível garantir a integridade dos dados e o sucesso de uma operação, as transações possuem 4 características: 
  • Atomicidade: Todo o fluxo de execução da transação deve ser realizado com sucesso, caso algum item venha a falhar, a transação deve ser desfeita;
  • Consistência: A transação deve garantir a integridade dos dados manipulados, os dados devem ser consistentes no começo e fim da transação;
  • Isolamento: Os dados de uma transação não podem afetar rotinas que não fazem parte da transação;
  • Durabilidade: As modificações realizadas dentro do escopo da transação, deve ser refletidas nos recursos envolvidos.
O fluxo de uma transação é o abaixo:
  1. A transação é iniciada;
  2. As operações são executadas;
  3. A transação é finalizada com:
    • Commit: Caso todas as operações sejam executadas com sucesso;
    • Rollback: Caso aconteça algo inesperado, fazendo com que a transação seja desfeita.
Para exemplificar o uso de transações vamos simular um cenário de venda, o processo consiste nas seguintes etapas: 
  1. Gerar o pedido;
  2. Encaminhar para lista de entrega;
  3. Realizar baixa no estoque.
Como exemplo, vamos simular que os passos 1 e 2 foram executados com sucesso, mas ao executar o passo 3, acontece algum erro no aplicativo, fazendo com que a operação não possa ser concluída.

Sem transação: Para este cenário a falta de transação seria muito problemático,  pois com a falha da etapa 3, teríamos a integridade e confiabilidade dos dados comprometida.

Com transação: A utilização de transação para este cenário é a forma mais indicada, pois com a falha da etapa 3, toda a transação seria desfeita, garantindo a integridade e a confiabilidade dos dados manipulados na operação.

Vale lembrar que a adoção de uma transação depende muito dos requisitos do sistema, a cenários onde não precisamos utilizar, e que caso seja utilizada de maneira indevida, podem prejudicar outros requisitos, como performance.

Transações Distribuídas

Transações distribuídas é um ponto com grande destaque na plataforma Java EE, com esse recurso podemos ter transações que envolvem mais de um recurso de persistência ou negócio, esse tipo de transação é dividido de 2 formas:

Local: Transação com apenas um recurso, ex:  uma base da dados, uma fila de mensagem, etc.
Global: Transação com mais de um recurso, ex: uma operação onde o contexto transacional pode envolver duas bases de dados, uma base de dados e uma fila de mensagem, etc.

A especificação EJB contempla a transação distribuída utilizando o protocolo de commit em duas fases, este protocolo permite que o gerenciador de transações consiga tratar uma transação com mais de um recurso e gerencie as operações de commit e rollback.

Isolamento de dados transacionais

Os níveis de isolamento de dados transacionais são disponibilizados pelas base de dados e tentam garantir como, onde, e quando os dados podem ser acessados.

Este isolamento deve ser analisado com muito detalhe, porque depende muito das regras de negócio, e a utilização de um nível inadequado, pode comprometer as funcionalidades de todo sistema.

Os isolamentos estão divididos basicamente em 4 níveis:
  • Read uncommited: Este nível é o mais baixo, ele permite que transações com este isolamento leia dados de outras transações que ainda não foram commitados;
  • Read commited: Este nível é o mais utilizado, ele permite que transações com este isolamento leia somente dados já commitados por outras transações.
  • Repeatable read: Este nível garante que uma transação leia sempre o mesmo conjunto de dados até o fim da transação, mesmo que neste tempo os dados sejam alterados em outras transações. 
  • Serializable: Este nível é o mais restritivo, ele bloqueia a tabela utilizada na transação até que a mesma seja concluída, com isso, é garantido que a tabela não tenha seus dados alterados no decorrer da transação, este nível deve ser usado com muito cuidado, pois pode trazer grandes problemas de performance no sistema.
Para mais detalhes sobre o suporte de transações com Java, veja o link oficial da Oracle sobre a Java Transaction API.

Agora que sabemos características de como uma transação funciona, podemos entrar em detalhes da utilização de transações com objetos EJB.

Até a próxima.

Comentários

Postagens mais visitadas do Blog