Pregunta de la entrevista: transacción declarativa de primavera

Existen los siguientes escenarios de código, Alos a1métodos de la clase no están marcados con @Transactionalanotaciones y los a2métodos están marcados con @Transactionalanotaciones, luego a1llame al a2método en el método, ¿comenzará la transacción en este momento?

No inicia una transacción. a1El método es Ael método nativo de la clase de destino . Al llamar a1, el método ingresa directamente a la clase de destino Apara llamar. Los Aúnicos a2métodos nativos en la clase de destino están marcados con @Transactionalanotaciones a1. Aquí se a2llama el a2método nativo ejecutado directamente , no se llama creando un objeto proxy Por TransactionInterceptorlo tanto, el invokemétodo que no ingresa no abre la transacción.

En este momento, si el a1método está marcado con @Transactionalanotaciones, el a2método no está marcado con @Transactionalanotaciones, pero a1el modificador de acceso del método protected, ¿ llamará a1al a2método en el método para iniciar la transacción?

No abrirá la transacción. @TransactionalEl mecanismo de trabajo se basa en AOP, y AOP se implementa utilizando un proxy dinámico, que es JDK o Cglib. Si se trata de un método proxy dinámico JDK, de acuerdo con el análisis anterior, podemos saber que el método objetivo de la clase objetivo está definido en la interfaz, es decir, debe ser un publicmétodo modificado para ser proxy. Si es el método Cglib, la clase proxy es una subclase de la clase objetivo, que en teoría puede ser proxy publicy protectedmétodos, pero cuando Spring puede determinar si la mejora de la transacción puede aplicarse a la clase objetivo actual, atraviesa el publicmétodo de la clase objetivo , por lo que el método Cglib también Solo válido para publicmétodos.

¿Cómo se implementa el procesamiento de transacciones declarativas en el marco de Spring?

Cuando el contenedor Spring inicializa cada bean singleton, atravesará todas las BeanPostProcessorclases de implementación en el contenedor y ejecutará sus postProcessAfterInitializationmétodos.Al ejecutar AbstractAutoProxyCreatorlos postProcessAfterInitializationmétodos de la clase, atravesará todos los aspectos en el contenedor para encontrar los aspectos que coinciden con el bean instanciado actualmente. Aquí obtendrá el aspecto del atributo de transacción, encontrará la @Transactionalanotación y su valor de atributo, y luego creará un objeto proxy basado en el aspecto obtenido. El valor predeterminado es usar el proxy dinámico JDK para crear el proxy. Si la clase objetivo es una interfaz, use el proxy dinámico JDK, de lo contrario use Cglib. En el proceso de creación del proxy, se obtendrá el interceptor correspondiente al método objetivo actual. En este momento, se obtendrá una TransactionInterceptorinstancia. En su invokemétodo, la transacción se inicia y se revierte. Cuando se requiere la operación de transacción, Spring llamará a la clase objetivo. Antes de que el método de destino comience la transacción, llama a la excepción para revertir la transacción, y la transacción se envía después de que se complete la llamada. La necesidad de iniciar una nueva transacción se determina en función @Transactionaldel valor del parámetro configurado en la anotación. Si necesita comenzar una nueva transacción, obtenga una Connectionconexión y luego cambie la transacción de confirmación automática de la conexión falsea envío manual. Cuando se llama al completeTransactionAfterThrowingmétodo de destino de la clase de destino, se ingresará el método si se produce una excepción .

¿Me puede decir el principio de su realización?

Si la clase Amarcada en la @Transactionalanotación, contenedor de primavera será la puesta en marcha, la clase Apara crear una clase de proxy B, clase Atodos los publicmétodos de la clase proxy Btener un método proxy correspondiente, llamar a la clase Auno de los publicmétodos entrará en el método proxy correspondiente Procesando en

Si sólo la clase A's bmétodos (utilizando publicmodificada) marcados en la @Transactionalanotación, contenedor de primavera serán la puesta en marcha, la clase es Acrear una clase de proxy B, pero sólo para la clase Aes bcrear un métodos de proxy, llamar a la clase A' s bmétodo entrará en la correspondiente delegación Procesado en el método, llame a Aotros publicmétodos de la clase o ingrese Ael método de la clase para el procesamiento. Antes de ingresar un método en la clase proxy, el método TransactionInterceptoren la clase se ejecutará primero para invokecompletar la lógica de todo el procesamiento de la transacción, como abrir una nueva transacción, monitorear si la transacción debe revertirse durante la ejecución del método objetivo y enviar la transacción después de que se complete el método objetivo. Etc.

¿El marco Spring implementa la reversión de transacciones, realiza operaciones de reversión de transacciones para todo tipo de excepciones?

Spring no realiza operaciones de reversión de transacciones en todos los tipos de excepciones. De manera predeterminada, solo realiza operaciones de reversión de transacciones en Unchecked Exception( Errory RuntimeException).

Publicado 94 artículos originales · me gusta 0 · visitas 722

Supongo que te gusta

Origin blog.csdn.net/qq_46578181/article/details/105458054
Recomendado
Clasificación