Sobes.tech
Middle+

O que é propagação e disseminação de transações em Java?

sobes.tech IA

Resposta da IA

A propagação (propagation) de transações em Java define como o contexto transacional se espalha entre métodos. Ao chamar um método transacional de outro método (transacional ou não), a regra de propagação decide se deve usar a transação existente, criar uma nova ou comportar-se de outra forma.

As regras de propagação mais comuns no Spring Framework:

  • REQUIRED: Se existir uma transação ativa, usá-la. Caso contrário, criar uma nova. Esta regra é a padrão.
  • SUPPORTS: Usar a transação existente, se houver. Caso contrário, executar o código sem transação.
  • MANDATORY: Usar a transação existente. Caso contrário, lançar uma exceção.
  • REQUIRES_NEW: Sempre criar uma nova transação independente. Se uma transação existir, ela será suspensa.
  • NOT_SUPPORTED: Executar o código sem transação. Se uma transação existir, ela será suspensa.
  • NEVER: Executar o código sem transação. Se uma transação existir, lançar uma exceção.
  • NESTED: Se existir uma transação ativa, criar uma transação "aninhada" (savepoint). Caso contrário, comportar-se como REQUIRED. Transações aninhadas não são suportadas por todos os SGBDs.

Exemplo de uso no Spring:

// Exemplo de uso da anotação @Transactional com Propagation
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createUserWithIndependentOperation(User user) {
    // Lógica de criação de usuário

    performIndependentOperation(); // Este método será executado numa nova transação
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void performIndependentOperation() {
    // Lógica de operação independente
}

A escolha da regra de propagação depende da atomicidade e isolamento requeridos para as operações. Uso incorreto pode levar a comportamentos indesejados, como perda de alterações ou bloqueios.