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 deste blog

Utilizando LocalDate, LocalDateTime e LocalTime na Prática

Tudo bem pessoal, hoje iremos avaliar e analisar operações de manipulação de Datas envolvendo a JavaTime API introduzida no Java 8.

Exemplos da java.time API
Já se passaram alguns anos desde o lançamento do Java 8 e mesmo após este período, há empresas que desconhecem o poder da java.time API, esta foi uma nova API de datas introduzida no Java 8 visando resolver problemas que tínhamos com as velhas classes Date e Calendar.

Vamos mostrar vários exemplos práticos do uso da API:
Criação de objetos No exemplo abaixo, estamos criando os objetos para manipulação de datas, perceba que temos 3 tipos, sendo LocalDate para manipular datas, LocalDateTime para manipular data/hora e LocalTime para horas:
LocalDate localDate = LocalDate.now(); LocalDateTime localDateTime = LocalDateTime.now(); LocalTime localTime = LocalTime.now();
Utilizando formatação Aqui realizamos a operação de formatação, perceba que não foi necessário utilizar a classe SimpleDateFormat, que usaríamos em conjunto com D…

Lendo e Manipulando arquivos CSV com Java

Olá hoje veremos como realizar a leitura e manipulação de arquivos CSV com Java, mostrando que as novas versões da plataforma Java deixaram algumas tarefas simples de serem realizadas.

Exemplo de Arquivo Hoje em dia é comum ao realizar integrações ou carga de dados o uso de arquivos CSV, isto porque, este arquivo possui uma estrutura de fácil entendimento e simples de manipular na maioria das plataformas de desenvolvimento.

Para realizar a leitura dos dados vamos manipular um arquivo com as seguintes colunas: namecpfagephone address:

name;cpf;age;phone;address caio;123456789;20;1145223643;AvenidaPaulista vinicius;147852369;18;1125253625;AvenidaManoel sandra;963258741;30;1174587858;RuaTeixeira regina;125478522;40;1145254536;RuaFernando fernando;785245563;42;1145253669;RuaPereira augusto;456123014;50;1125363633;AvenidaPaulinia maria;456123789;10;1125455525;AvenidaNossaSenhora
Para representar os dados em objetos Java iremos utilizar a seguinte classe:

importlombok.AllArgsConstruc…

Versionamento de Banco Dados com Flyway

Olá pessoal, hoje iremos analisar e aprender como realizar o versionamento e gerenciamento das bases de dados relacionais utilizando o framework Flyway.

Versionamento de Banco Dados Ao trabalhar com desenvolvimento de sistemas é comum realizarmos o versionamento, isso porque uma aplicação pode necessitar de correções, novas funcionalidades e evoluções, onde para garantir a compatibilidade e cuidar do seu ciclo de vida, geramos versões onde é especificado quais itens estão presentes em cada release.
Vamos imaginar seguinte cenário: Sistema ERP1.0.0: Entrega dos módulos Financeiro e RH;1.1.0: Entrega do módulo Contas a Receber. Perceba que a ideia é controlar o que cada versão possui de diferente, e para controlar essas mudanças no lado da aplicação existem várias técnicas e ferramentas, mas e para controlar as mudanças no lado do Banco de dados ? 
Para isso podemos utilizar ferramentas de versionamento que ajudam a realizar este controle, a ferramenta que iremos utilizar é o Flyway.
Con…