Transações não devem ser habilitadas por default

Atualmente estou trabalhando num projeto que obviamente usa a stack do Spring, facilitado pelo Spring Boot :). E queria contar uma coisinha sobre o uso do Spring Data JPA.

Por algum motivo, que eu realmente não sei explicar, os métodos declarados nos seus Repositories criados em cima do Spring Data JPA são transacionais por default. Ou seja, se você chamar dois métodos diferentes eles serão executados em transações diferentes e, quase sempre, não é isso que você quer.

As transações são intimamente ligadas com fluxos de negócios e tal comportamento não deveria ser decidido implicitamente. Isso atrapalha o entendimento do código e sua consequentemente manutenção.

Para resolver, de maneira fácil, minha sugestão é desabilitar esse comportamento. Toda transação precisa ser declarada. Para fazer isso, vá na sua classe de startup do projeto com Spring Boot e adicione a seguinte annotation:

@SpringBootApplication
@EnableJpaRepositories(enableDefaultTransactions = false)
public class Boot {
....
}

Pronto, agora se você não anotar o método com @Transactional vai receber uma exception informando que uma transação é necessária para aquela operação. Em geral, todo código de negócio que é explícito, tende a ser mais benéfico no médio e longo prazo.

Esse post foi super rápido, mas espero que seja útil. E a verdade é que eu estava com saudade de escrever por aqui também :).

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s