Pergunta

Estou usando o Spring 2.5 Transaction Management e tenho a seguinte configuração:

Bean1

@Transactional(noRollbackFor = { Exception.class })
public void execute() {
  try {
    bean2.execute();
  } catch (Exception e) {
    // persist failure in database (so the transaction shouldn't fail)
    // the exception is not re-thrown
  }
}

Bean2

@Transactional
public void execute() {
  // do something which throws a RuntimeException
}

A falha nunca é persistida em dB de Bean1 porque toda a transação é revertida.

Eu não quero adicionar Norollbackfor No Bean2, porque é usado em muitos lugares que não têm lógica para lidar com exceções de tempo de execução corretamente.

Existe uma maneira de evitar que minha transação seja revertida apenas quando o bean2.Execute () é chamado de Bean1?

Caso contrário, acho que minha melhor opção é persistir minha falha dentro de uma nova transação? Alguma coisa limpa eu posso fazer?

Foi útil?

Solução

Esta é uma das advertências das anotações ... sua classe não é reutilizável!

Se você configurar suas transações no XML, se tivesse sido possível.

Supondo que você use a configuração XML: se não estiver consumindo recursos caros, você pode criar outra instância do Bean2 para o uso do código especificado. Ou seja, você pode configurar um como especificado acima e um sem reversão para exceção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top