Recentemente, encontrei uma situação em que a transação não reversa. Também pensei em dizer que existem bugs nas transações da JPA? Estou pensando muito ...
Para imprimir claramente os logs, adiciono o Tyrcatch para imprimir os logs na captura. Mas a situação aqui vem. Quando esse método é anormal, o log é impresso, mas a transação adicionada não é revertida.
exemplo:
Métodos como esse não revertem (um método erros, o outro método não reverterá):
if (usersAve) {tente {userdao.save (usuário); UserCapabilityQuotadao.Save (CapabilityQuota); } catch (Exceção e) {Logger.info ("Capacidade de abrir a interface, exceção de abertura da conta, informações de exceção:"+e); }}O método a seguir recua (um método erros, o outro método recairá):
if (usersAve) {tente {userdao.save (usuário); UserCapabilityQuotadao.Save (CapabilityQuota); } catch (Exceção e) {Logger.info ("Capacidade de abrir a interface, exceção de abertura da conta, informações de exceção:"+e); lançar novo RuntimeTeException (); }}ou:
if (usersAve) {tente {userdao.save (usuário); UserCapabilityQuotadao.Save (CapabilityQuota); } catch (Exceção e) {Logger.info ("Capacidade de abrir a interface, exceção de abertura da conta, informações de exceção:"+e); TransactionAspectSupport.CurrentTransactionStatus (). Setrollbackonly (); }}Por que você não pode sair? ? Não está entendendo o mecanismo de transação da primavera. ! !
***** A transação padrão da mola é revertida apenas quando ocorre uma excelente hora de execução. *******
O princípio da captura de exceção de Springlaop: o método interceptado precisa lançar uma exceção explicitamente e não pode ser processada de forma alguma. Dessa forma, o agente da AOP pode pegar a exceção do método e reverter. Por padrão, a AOP apenas pega a exceção da RuntimeException, mas pode passar.
Configure para capturar exceções específicas e reverter
Em outras palavras, não use o TryCatch no método de serviço ou add ThrowNeRuntimeExCetPion () na captura, para que o programa possa ser capturado pela AOP e revertido quando o programa for excepcional.
Solução:
Solução 1. Por exemplo, se a camada de serviço lidar com transações, o método no serviço não executará a captura de exceção ou adiciona uma declaração thrownewRuntimeException () à declaração de captura, para que a AOP pegue a exceção e depois recupere e lidera a exceção.
Solução 2. Adicione o: transactionAspectSupport.CurrentTransactionStatus (). Setrollbackonly (); Declaração para a declaração de captura do método da camada de serviço, reversão manualmente, para que a camada superior não precise lidar com exceções (a prática atual do projeto)
Resumir
O exposto acima é todo o conteúdo deste artigo sobre a análise das instâncias de reversão da exceção de transações de primavera. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!