Sobes.tech
Middle

O que significa a anotação @Transactional no Spring Data?

sobes.tech IA

Resposta da IA

A anotação @Transactional no Spring Data indica que um método ou classe deve ser executado no âmbito de uma transação. O Spring AOP (Programação Orientada a Aspectos) cria um objeto proxy em torno de tal método, que gere o ciclo de vida da transação.

As ações principais realizadas por @Transactional:

  1. Início da transação: Antes de executar o método anotado, uma nova transação é aberta ou uma existente é usada.
  2. Execução do método: A lógica do próprio método é executada.
  3. Confirmação ou rollback da transação:
    • Se o método termina com sucesso sem exceções (por padrão apenas RuntimeException), a transação é confirmada (commit).
    • Se uma exceção é lançada do método (por padrão RuntimeException), a transação é revertida (rollback).

Principais atributos da anotação:

  • propagation: Define como as transações interagem entre si (por exemplo, REQUIRED, REQUIRES_NEW, SUPPORTS). Por padrão, REQUIRED.
  • isolation: Define o nível de isolamento da transação para evitar problemas de acesso concorrente aos dados (por exemplo, READ_COMMITTED, REPEATABLE_READ). Por padrão, é usado o nível de isolamento do banco de dados.
  • readOnly: Indica que a transação deve ser executada em modo somente leitura. Otimiza o desempenho para leituras.
  • timeout: Define o tempo máximo de execução da transação antes de um rollback automático.
  • rollbackFor: Indica a lista de tipos de exceções que, ao ocorrer, devem fazer a transação reverter. Por padrão, reverte em RuntimeException.
  • noRollbackFor: Indica a lista de tipos de exceções que, ao ocorrer, não devem fazer a transação reverter.

Exemplo de uso:

// Exemplo de camada de serviço
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional // Este método será executado numa transação
    public User createUser(User user) {
        // Lógica para criar utilizador, possivelmente incluindo várias operações com a BD
        userRepository.save(user);
        // Pode haver outra operação de salvamento ou atualização
        // userRepository.updateRelatedInfo(user.getId(), ...);
        return user;
    }

    @Transactional(readOnly = true) // Método apenas para leitura, otimização
    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @Transactional(rollbackFor = CustomBusinessException.class) // Reverter em caso de exceção personalizada
    public void performCriticalOperation(Long userId) throws CustomBusinessException {
        // Lógica de operação crítica
        // Pode lançar CustomBusinessException
    }
}

A anotação @EnableTransactionManagement geralmente é usada numa classe de configuração para ativar o suporte à gestão declarativa de transações.