Varias situaciones de falla de transacción de primavera y sus razones
Es posible que hayas visto varias situaciones de fallas en las transacciones de Spring en muchos artículos, así que hoy intentaré ver si puedo obtener algo diferente. Vaya directamente al tema
Motivo del error: el requisito previo para que las transacciones Spring sean válidas es que el servicio debe ser un objeto Bean
Solución: inyectar el servicio en Spring
Motivo del error: Spring solo revertirá las excepciones no comprobadas y las excepciones de error de forma predeterminada
Solución: configurar rollbackFor
Fallo: las transacciones de Spring solo se pueden procesar cuando las excepciones lanzadas por el se capturan los servicios
Motivo: las transacciones de Spring solo se pueden procesar cuando se detectan las excepciones lanzadas por el servicio.
Solución:
1. Lanzar la excepción tal cual
2. Establecer TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); > Motivo del error: el recorte de transacciones de Spring tiene la prioridad más baja, pero si el recorte personalizado tiene la misma prioridad y el recorte personalizado no maneja la excepción correctamente, será lo mismo que la empresa que detecta la excepción. En la misma situación, la empresa detectará su propia excepción
Solución:
1. Lanzar la excepción tal como está en el recorte
2. ) .setRollbackOnly();
Motivo del error: las transacciones Spring deben ser públicas de forma predeterminada para que todos los permisos de los métodos surtan efecto
Solución:
1. p >
2. Modifique TansactionAttributeSource y cambie publicMethodsOnly a false. Esto se obtiene del seguimiento del código fuente.
3. Abra el modo proxy de AspectJ y obtengalo del documento de primavera.
> Pasos específicos:
1. Introduzca las coordenadas de aspectojrt y los complementos correspondientes en pom
2. Agregue la siguiente configuración a la clase de inicio
Nota: si ejecutándose en idea, se requiere la siguiente configuración
4. Utilice TransactionTemplate directamente
Ejemplo:
Motivo del error: el escaneo el rango del subcontenedor es demasiado grande, el servidor fue escaneado sin configuración de transacción
Solución:
1.
2. No usar padre-hijo contenedores, todos los beans se entregan al mismo contenedor. Una administración de contenedores
Notas: debido a que en el ejemplo se usa springboot, y springboot no tiene contenedores padre-hijo de forma predeterminada cuando se inicia, solo hay uno. un contenedor, por lo que el escenario del ejemplo falla
Motivo: debido a que las transacciones Spring se implementan mediante proxies dinámicos, si un método se modifica usando final, la clase proxy no puede anular el método de destino para incorporar la funcionalidad de transacción p>
Solución:
1. No utilice el método de modificación final
Solución:
1.
Solución:
1.
Solución:
1:
1. Inyéctate para llamarlo
2. Utilice @EnableAspectJAutoProxy(exposeProxy = true) + AopContext. currentProxy()
Esta es la primera vez que se mejora un método de esta clase sin un proxy.
fuerte> Motivo del error: porque las transacciones de Spring se implementan a través de conexiones de bases de datos y la conexión de bases de datos Spring se coloca dentro de threadLocal. La misma transacción solo puede utilizar la misma conexión de base de datos. En un escenario multiproceso, las conexiones de la base de datos no son las mismas, es decir, pertenecen a diferentes transacciones
Motivo del error: la función de propagación utilizada no admite transacciones
Motivo En caso de error: utilice una función de propagación que no admita transacciones. Motor de almacenamiento. Por ejemplo, MyISAM en mysql
Nota: Porque Springboot habilita el administrador de transacciones de forma predeterminada. DataSourceTransactionManagerAutoConfiguración. Por lo tanto, se omite el ejemplo
Motivo del error: cuando se crea una instancia de la clase de proxy antes que el postprocesador AbstractAutoProxyCreator, el postprocesador AbstractAutoProxyCreator no podrá utilizar las mejoras de la clase de proxy
Este artículo En realidad, hay 14 situaciones en las que las transacciones Spring fallan. Muchas de estas 14 situaciones se atribuyen al mismo tipo de problema, por ejemplo, debido a servidores proxy dinámicos, calificadores de métodos, tipos de excepción, etc.
< p. > /lyb-geek/springboot-learning/tree/master/springboot-transaction-invalid-case