Sobes.tech
Middle

O que é a anotação @Transactional no contexto do Java?

sobes.tech IA

Resposta da IA

A anotação @Transactional em Java é usada para a gestão declarativa de transações. Permite definir os limites das transações, indicando quais métodos devem ser executados dentro de uma mesma transação.

Principais aspetos:

  • Integração: É mais frequentemente usada em conjunto com Spring Framework, EJB ou outros frameworks que fornecem gestão de transações.
  • Proxy: O framework cria um objeto proxy que envolve o objeto alvo com métodos anotados. Antes de chamar o método anotado, o proxy inicia a transação, e após a sua execução, ela é confirmada ou revertida dependendo do resultado (se uma exceção for lançada).
  • Atributos: Possui vários atributos para configurar o comportamento da transação, tais como:
    • propagation: define como um método transacional deve comportar-se ao ser chamado de outro contexto transacional. Por exemplo, REQUIRED, REQUIRES_NEW, SUPPORTS, NOT_SUPPORTED, NEVER, MANDATORY.
    • isolation: define o nível de isolamento para a transação. Por exemplo, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
    • readOnly: indica que a transação é apenas para leitura de dados, o que às vezes permite otimizar o desempenho.
    • timeout: define o tempo de espera para a transação.
    • rollbackFor e noRollbackFor: indicam em que exceções a transação deve ser revertida ou não, respetivamente.

Exemplo de uso:

// Exemplo de uso no Spring
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    // Este método será executado dentro de uma transação
    @Transactional
    public void createUser() {
        // Lógica para criar utilizador e guardar na base de dados
        // Se for lançada uma RuntimeException, o Spring irá reverter a transação
    }

    // Este método será executado dentro de uma transação com configurações específicas
    @Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
    public User findUserById(Long id) {
        // Lógica de procura de utilizador
        return null; // Exemplo
    }
}

@Transactional simplifica a gestão de transações, permitindo ao desenvolvedor focar na lógica de negócio, e não na API de baixo nível de gestão de transações (por exemplo, JTA ou JDBC Connection).