Confira neste Papo Reto, José Augusto falando sobre Escopo Transacional com Spring e Hibernate.

Entre os tópicos abordados estão:
Propagations | Proxy | Isolations | Exception Treatment | Readonly

Agora vamos entrar em cada um deles com mais detalhes:
A Propagação define o limite de transação da nossa lógica de negócio. O spring consegue começar ou pausar uma transação de acordo com as nossas configurações do Propagation. O spring chama o TransactionManager::getTransaction para obter ou criar a transação de acordo com o Propagation.

Propagation

Os tipos de propagação existentes são:

  • Required: Mantém uma transação existente ou cria uma nova caso nenhuma exista, é a propagação default do spring
  • Supports: Mantém uma transação existente, executa o método sem transação caso nenhuma exista
  • Mandatory: Mantém uma transação existente, lança uma exception caso não exista uma transação
  • Not Supported: Executa o método sem nenhuma transação e suspende a transação caso exista uma
  • Never: Executa o método sem transação e lança uma exception caso uma exista
  • Nested: Executada dentro de outra transação se uma existir e se comporta como REQUIRED caso nenhuma exista.
  • Requires New: Cria uma nova transação e suspende a transação atual caso exista

Proxy

As transações do spring são baseadas em proxys. Ele funciona assim, um Bean A tem uma transação que chama a transação do Bean B, o A tem referência a uma proxy, que delega a transação para o Bean B. Essa proxy é responsável por começar, commitar ou dar rollback em na transação.

José mostra com um exemplo o método transacional do serviço chamando outro método transacional dele mesmo, então o spring não consegue interceptar o chamado e começar uma nova transação. É apenas um método comum chamado sem nenhum envolvimento de proxy. Então, se você quiser começar uma nova transação, o método notificarExecucao() deve estar em outro Bean do spring, injetado no seu Bean atual.

Isolations

A isolação é uma das propriedades comuns do ACID ( Atomicidade, Consistência, Isolação e Durabilidade). A isolação descreve como as mudanças serão aplicadas por transações concorrentes e como elas serão visíveis umas as outras. Cada nível de isolação previne um ou mais problemas de concorrência dentro de uma transação, que são:

  • Dirty Read: Lê as mudanças não commitadas de uma transação concorrente.
  • Non Repeatable: obtém um resultado diferente na releitura de uma linha se uma transação simultânea atualizar essa linha e forem commitadas as alterações.
  • Phantom Read: obtém resultados diferentes após a re-execução de uma consulta no intervalo caso outra transação adicionar ou remover linhas nesse intervalo de tempo e commitar.

Os tipos de isolação existentes são:

  • Default: Utiliza a isolação padrão baseada no seu banco de dados
  • Read Uncommited: É o nível mais baixo de isolação e permite o maior número de concorrência. Sofre de todos os problemas de concorrência.
  • Read Commited: Segundo nível de isolação, previne o Dirty Read.
  • Repeatable Read: Terceiro nível de isolação, previne Dirty Read e Non Repeatable.
  • Serializable: É o nível mais alto de isolação. Previne todos os problemas de concorrência mas pode levar ao menor número de acessos porquê executa as chamadas em sequência.

Exception Treatment

As transações por padrão apenas dão rollback quando lançadas exceptions unchecked (exceções que herdam de RuntimeException)

Em alguns casos, pode ser um problema não dar rollback em exceções checked (exceções que herdam de Exception)
como commitar uma criação de um objeto novo com falhas que não deveria acontecer.

Readonly

Se você especificar o atributo readonly como true, o FlushMode da transação será modificado para FlushMode.NEVER na sessão atual do Hibernate, o que irá prevenir que a transação atual seja commitada.

O readonly é bastante útil em cenários de busca de objetos, onde normalmente não é necessário persistir nada no banco de dados.

Assista a apresentação

Fontes:

Autor

Wilson Souza é Gerente de Marketing da Bluesoft. Formado e pós Graduado pela Instituição Mackenzie, possui também MBA pela FGV. Wilson tem mais de 10 anos de experiência na área de Relacionamento e Marketing, atuando em diversas áreas e segmentos do mercado.

Deixe aqui o seu comentário