Spring - Gerenciamento de transações

Uma transação de banco de dados é uma sequência de ações que são tratadas como uma única unidade de trabalho. Essas ações devem ser totalmente concluídas ou não terão efeito algum. O gerenciamento de transações é uma parte importante do aplicativo corporativo orientado para RDBMS para garantir a integridade e consistência dos dados. O conceito de transações pode ser descrito com as seguintes quatro propriedades principais descritas comoACID -

  • Atomicity - Uma transação deve ser tratada como uma única unidade de operação, o que significa que toda a sequência de operações foi bem ou malsucedida.

  • Consistency - Isso representa a consistência da integridade referencial do banco de dados, chaves primárias exclusivas nas tabelas, etc.

  • Isolation- Pode haver muitos processamento de transações com o mesmo conjunto de dados ao mesmo tempo. Cada transação deve ser isolada de outras para evitar a corrupção de dados.

  • Durability - Assim que uma transação for concluída, os resultados dessa transação devem se tornar permanentes e não podem ser apagados do banco de dados devido a falha do sistema.

Um sistema de banco de dados RDBMS real garantirá todas as quatro propriedades para cada transação. A visão simplista de uma transação emitida para o banco de dados usando SQL é a seguinte -

  • Comece a transação usando o comando begin transaction .

  • Execute várias operações de exclusão, atualização ou inserção usando consultas SQL.

  • Se todas as operações forem bem-sucedidas, execute a confirmação, caso contrário, reverta todas as operações.

O Spring framework fornece uma camada abstrata sobre diferentes APIs de gerenciamento de transações subjacentes. O suporte a transações do Spring visa fornecer uma alternativa às transações EJB, adicionando recursos de transação aos POJOs. O Spring oferece suporte ao gerenciamento de transações programáticas e declarativas. Os EJBs requerem um servidor de aplicativos, mas o gerenciamento de transações Spring pode ser implementado sem a necessidade de um servidor de aplicativos.

Transações locais vs. globais

As transações locais são específicas para um único recurso transacional, como uma conexão JDBC, enquanto as transações globais podem abranger vários recursos transacionais como transações em um sistema distribuído.

O gerenciamento de transações locais pode ser útil em um ambiente de computação centralizado onde os componentes e recursos do aplicativo estão localizados em um único site, e o gerenciamento de transações envolve apenas um gerenciador de dados local em execução em uma única máquina. As transações locais são mais fáceis de serem implementadas.

O gerenciamento de transações globais é necessário em um ambiente de computação distribuído, onde todos os recursos são distribuídos em vários sistemas. Nesse caso, o gerenciamento de transações precisa ser feito em nível local e global. Uma transação distribuída ou global é executada em vários sistemas, e sua execução requer coordenação entre o sistema de gerenciamento de transação global e todos os gerenciadores de dados locais de todos os sistemas envolvidos.

Programático vs. Declarativo

Spring suporta dois tipos de gerenciamento de transações -

  • Gerenciamento de transação programática - Isso significa que você deve gerenciar a transação com a ajuda da programação. Isso proporciona extrema flexibilidade, mas é difícil de manter.

  • Gerenciamento declarativo de transações - isso significa que você separa o gerenciamento de transações do código de negócios. Você só usa anotações ou configuração baseada em XML para gerenciar as transações.

O gerenciamento de transações declarativas é preferível ao gerenciamento de transações programáticas, embora seja menos flexível do que o gerenciamento de transações programáticas, que permite controlar as transações por meio de seu código. Mas, como uma espécie de preocupação transversal, o gerenciamento de transações declarativas pode ser modularizado com a abordagem AOP. O Spring oferece suporte ao gerenciamento de transações declarativas por meio da estrutura Spring AOP.

Abstrações de transações de primavera

A chave para a abstração da transação Spring é definida pela interface org.springframework.transaction.PlatformTransactionManager , que é a seguinte -

public interface PlatformTransactionManager {
   TransactionStatus getTransaction(TransactionDefinition definition);
   throws TransactionException;
   
   void commit(TransactionStatus status) throws TransactionException;
   void rollback(TransactionStatus status) throws TransactionException;
}

Sr. Não Método e Descrição
1

TransactionStatus getTransaction(TransactionDefinition definition)

Este método retorna uma transação atualmente ativa ou cria uma nova, de acordo com o comportamento de propagação especificado.

2

void commit(TransactionStatus status)

Este método confirma a transação dada, em relação ao seu status.

3

void rollback(TransactionStatus status)

Este método executa uma reversão da transação fornecida.

O TransactionDefinition é a interface principal do suporte à transação no Spring e é definido da seguinte forma -

public interface TransactionDefinition {
   int getPropagationBehavior();
   int getIsolationLevel();
   String getName();
   int getTimeout();
   boolean isReadOnly();
}

Sr. Não Método e Descrição
1

int getPropagationBehavior()

Este método retorna o comportamento de propagação. O Spring oferece todas as opções de propagação de transação familiares do EJB CMT.

2

int getIsolationLevel()

Este método retorna o grau em que esta transação está isolada do trabalho de outras transações.

3

String getName()

Este método retorna o nome desta transação.

4

int getTimeout()

Este método retorna o tempo em segundos em que a transação deve ser concluída.

5

boolean isReadOnly()

Este método retorna se a transação é somente leitura.

A seguir estão os valores possíveis para o nível de isolamento -

Sr. Não Isolamento e descrição
1

TransactionDefinition.ISOLATION_DEFAULT

Este é o nível de isolamento padrão.

2

TransactionDefinition.ISOLATION_READ_COMMITTED

Indica que leituras sujas são evitadas; leituras não repetíveis e leituras fantasmas podem ocorrer.

3

TransactionDefinition.ISOLATION_READ_UNCOMMITTED

Indica que podem ocorrer leituras sujas, leituras não repetíveis e leituras fantasmas.

4

TransactionDefinition.ISOLATION_REPEATABLE_READ

Indica que leituras sujas e leituras não repetíveis são evitadas; podem ocorrer leituras fantasmas.

5

TransactionDefinition.ISOLATION_SERIALIZABLE

Indica que leituras sujas, leituras não repetíveis e leituras fantasmas são evitadas.

A seguir estão os valores possíveis para os tipos de propagação -

Sr. Não. Propagação e descrição
1

TransactionDefinition.PROPAGATION_MANDATORY

Suporta uma transação atual; lança uma exceção se nenhuma transação atual existir.

2

TransactionDefinition.PROPAGATION_NESTED

É executado dentro de uma transação aninhada se existir uma transação atual.

3

TransactionDefinition.PROPAGATION_NEVER

Não suporta uma transação atual; lança uma exceção se houver uma transação atual.

4

TransactionDefinition.PROPAGATION_NOT_SUPPORTED

Não suporta uma transação atual; em vez disso, sempre execute de forma não transacional.

5

TransactionDefinition.PROPAGATION_REQUIRED

Suporta uma transação atual; cria um novo se não houver nenhum.

6

TransactionDefinition.PROPAGATION_REQUIRES_NEW

Cria uma nova transação, suspendendo a transação atual, se houver.

7

TransactionDefinition.PROPAGATION_SUPPORTS

Suporta uma transação atual; é executado de forma não transacional, se não houver nenhum.

8

TransactionDefinition.TIMEOUT_DEFAULT

Usa o tempo limite padrão do sistema de transação subjacente ou nenhum se os tempos limite não forem suportados.

A interface TransactionStatus fornece uma maneira simples para o código transacional controlar a execução da transação e consultar o status da transação.

public interface TransactionStatus extends SavepointManager {
   boolean isNewTransaction();
   boolean hasSavepoint();
   void setRollbackOnly();
   boolean isRollbackOnly();
   boolean isCompleted();
}

Sr. Não. Método e Descrição
1

boolean hasSavepoint()

Este método retorna se esta transação carrega internamente um ponto de salvamento, ou seja, foi criada como uma transação aninhada com base em um ponto de salvamento.

2

boolean isCompleted()

Este método retorna se a transação foi concluída, ou seja, se ela já foi confirmada ou revertida.

3

boolean isNewTransaction()

Este método retorna verdadeiro caso a transação presente seja nova.

4

boolean isRollbackOnly()

Este método retorna se a transação foi marcada como somente rollback.

5

void setRollbackOnly()

Este método define a transação como somente rollback.