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.