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:
- Início da transação: Antes de executar o método anotado, uma nova transação é aberta ou uma existente é usada.
- Execução do método: A lógica do próprio método é executada.
- 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).
- Se o método termina com sucesso sem exceções (por padrão apenas
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 emRuntimeException.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.