Skip to content

💼 @Transactional

Pra que serve o @Transactional?

A anotação @Transactional serve para controlar transações de banco de dados de forma automática.

Ou seja, ela garante que um bloco de operações SQL (ou JPA):

  • só será confirmado (commit) se tudo der certo,

  • e será desfeito (rollback) se alguma exceção acontecer.

Exemplo:

@Service
public class ContaService {

    @Autowired
    private ContaRepository repository;

    @Transactional
    public void transferir(Long origemId, Long destinoId, double valor) {

        Conta origem = repository.findById(origemId).orElseThrow();
        Conta destino = repository.findById(destinoId).orElseThrow();

        origem.setSaldo(origem.getSaldo() - valor);
        destino.setSaldo(destino.getSaldo() + valor);

        repository.save(origem);
        repository.save(destino);

        // Se der erro aqui, tudo é desfeito (rollback)
    }
}


  • Se tudo correr bem → o Spring faz COMMIT.

  • Se lançar uma exceção (ex: RuntimeException) → o Spring faz ROLLBACK automático, ou seja, nenhuma das alterações é gravada no banco.

É quase a mesma ideia do que usar o START TRANSACTION no MySql, por exemplo:

START TRANSACTION;

UPDATE conta SET saldo = saldo - 100 WHERE id = 1;
UPDATE conta SET saldo = saldo + 100 WHERE id = 2;

COMMIT;

Você tem o poder de desfazer essa transação antes do commit. O ideal é fazer o update, checar se deu tudo certo, e por fim dar um commit, mas se algo der errado dentro do bloco da transação, será feito um rollback automático de tudo dentro do bloco. Porém, sevocê commitou no final e ocorreu tudo bem, não é possível dar rollback mais.