Spring-Java Things Rollback Fails Fails Processing Recientemente, estaba trabajando en un proyecto y descubrí accidentalmente que una clase estaba lanzando la operación de reversión de las cosas, y los datos se insertaron normalmente en la base de datos, por lo que verifiqué cuidadosamente y analicé la razón específica.
Todo todavía comienza con las excepciones verificadas de Java y las excepciones no verificadas.
Entonces, ¿qué es una excepción de tipo de inspección y qué es una excepción de tipo de inspección?
Hay dos puntos de juicio más simples:
1. La excepción sin verificación heredada de RuntimeException o error, mientras que la excepción de verificación heredada de la excepción (por supuesto, RuntimeException en sí también es una subclase de excepción).
2. Las excepciones no verificadas se pueden atrapar sin ser atrapadas, mientras que las excepciones verificadas deben procesarse con el bloque de la declaración de captura o la entrega de la excepción al método superior para el procesamiento. En resumen, el código debe escribirse para procesarlo.
La estructura de excepción de Java se muestra en la figura a continuación. Entre ellos, las excepciones que heredan directamente la excepción debe ser atrapada y se verifican excepciones.
Veamos mi código:
1. El nombre del método está precedido por
@Transactional
2. Archivo de configuración de Spring ApplicationContext-xxx.xml también tiene configuraciones relacionadas para las cosas de Spring.
<bean id = "transaccionManager"> <Property name = "DataSource" ref = "DataSource"/> <Property Name = "RollbackOnCommitFailure" Value = "True"> </Property> </le bean>
Pero, ¿por qué se ha enviado lo que se ha enviado después del intento ... La excepción de la excepción de lanzamiento de captura no se retrocede cuando se llama al método de la capa de servicio?
Después de verificar la documentación de primavera relevante, descubrí que la gestión de transacciones declaraciones de primavera original realizó reversiones de transacciones en excepciones no verificadas y excepciones de tiempo de ejecución de forma predeterminada, mientras que no hay reversiones en las excepciones verificadas.
La excepción presentada por try ... Catch en el código es una excepción de tipo de verificación. El marco de Spring no retrocedirá de forma predeterminada.
En la programación, se pueden evitar excepciones no verificadas, mientras que las excepciones verificadas deben procesarse con bloques de instrucción de prueba o entregar el método superior para manejarlas. En resumen, el código debe escribirse para procesarlos.
Por lo tanto, la excepción debe ser atrapada en el servicio y luego volver a lanzar manualmente una excepción no verificada nuevamente para que la transacción pueda entrar en vigencia. Por ejemplo:
Pruebe {………} Catch (Exception e) {……… tire New BusinessException (e.getMessage ()); }Por supuesto, tenemos una manera más fácil de resolver este problema, es decir, cambiar el método de reversión predeterminado anotando los parámetros.
Norollbackfor y Rollbackfor se definen en la anotación @Transaction para especificar si se retrocede una cierta excepción.
Use ejemplos:
@Transaction (norollbackfor = runtimeException.class)
@Transaction (Rollbackfor = Exception.Class)
Por lo tanto, en la pregunta anterior, puede agregar directamente el parámetro de reversión @Transaction (Rollbackfor = Exception.Class), que cambia el método de procesamiento de transacciones predeterminado.
Revelación:
Esto requiere que heredemos la excepción personalizada de RuntimeException al personalizar la excepción, de modo que cuando se lance, se manejará con precisión por el procesamiento de transacciones predeterminado de Spring.
Resumir
Lo anterior es todo el contenido de este artículo sobre el problema del fracaso de la reversión de la transacción Java. 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!