Recientemente, encontré una situación en la que la transacción no retrocede. ¿También consideré decir que hay errores en las transacciones de JPA? Estoy pensando demasiado ...
Para imprimir los registros claramente, agrego Tyrcatch para imprimir los registros en la captura. Pero la situación aquí viene. Cuando este método es anormal, el registro se imprime, pero la transacción agregada no se retira hacia atrás.
ejemplo:
Métodos como este no se revertirán (errores de un método, el otro método no regará):
if (userseVe) {try {userDao.save (usuario); UserCapabilityquotadao.save (Capabilityquota); } Catch (Exception e) {logger.info ("Capacidad para abrir la interfaz, apertura de la cuenta Excepción, información de excepción:"+E); }}El siguiente método regresa (un método errores, el otro método retrocederá):
if (userseVe) {try {userDao.save (usuario); UserCapabilityquotadao.save (Capabilityquota); } Catch (Exception e) {logger.info ("Capacidad para abrir la interfaz, apertura de la cuenta Excepción, información de excepción:"+E); tirar nueva runtimeException (); }}o:
if (userseVe) {try {userDao.save (usuario); UserCapabilityquotadao.save (Capabilityquota); } Catch (Exception e) {logger.info ("Capacidad para abrir la interfaz, apertura de la cuenta Excepción, información de excepción:"+E); TransactionAspectSupport.CurrentTransactionStatus (). SetRollbackonly (); }}¿Por qué no puedes salir? ? No es comprender el mecanismo de transacción de la primavera. ! !
***** La transacción de resorte predeterminada solo se remonta cuando ocurre un runtimeExcetpion no captado. *******
El principio de la captura de excepción de Spreraop: el método interceptado debe lanzar una excepción explícitamente y no se puede procesar de ninguna manera. De esta manera, el agente AOP puede captar la excepción del método y retroceder. Por defecto, AOP solo capta la excepción de RuntimeException, pero puede pasar.
Configurar para atrapar excepciones específicas y retroceder
En otras palabras, no use TryCatch en el método de servicio o agregue ThrownewrunteExCetPion () a la captura, de modo que el programa pueda ser atrapado por AOP y retroceder cuando el programa es excepcional.
Solución:
Solución 1. Por ejemplo, si la capa de servicio maneja las transacciones, entonces el método en el servicio no realiza captura de excepciones, o agrega una instrucción throweowrunteException () a la instrucción Catch, de modo que AOP atrapa la excepción y luego vuelve a revertir, y la capa superior del servicio (cliente web, viendo la acción de la capa) debe continuar con la captura y el manejo de la excepción.
Solución 2. Agregue: TransactionAspectSupport.CurrentTransactionStatus (). SetRollbackOnly (); Declaración a la Declaración de captura del método de la capa de servicio, retroceso manual, de modo que la capa superior no necesita manejar las excepciones (la práctica de proyecto actual)
Resumir
Lo anterior es todo el contenido de este artículo sobre el análisis de las instancias de reversión de la excepción de la transacción de primavera. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!