Red de conocimiento informático - Aprendizaje de código fuente - Eliminar transacción de Spring

Eliminar transacción de Spring

Una transacción es la unidad más básica de operaciones de una base de datos. Es un conjunto de operaciones lógicas, o todas tienen éxito o todas fallan. Es una unidad de trabajo indivisible.

Las transacciones tienen cuatro características: atomicidad, consistencia y durabilidad del aislamiento, que se denominan características ACID.

Ejemplo: Transferencia bancaria. Xiao Ming transfiere $100 a Xiao Hong. Xiao Ming necesita reducir el saldo en 100 y Xiao Hong necesita aumentar el saldo en 100. Estas dos operaciones deben tener éxito al mismo tiempo. Si ocurre una excepción después de que la transferencia de Xiao Ming sea exitosa, Xiao Ming disminuirá el saldo en 100, pero Xiao Hong no aumentará el saldo en 100. Esto resultará en una pérdida de dinero. Esto está absolutamente prohibido. El pseudocódigo es el siguiente:

Spring admite dos tipos de gestión de transacciones.

Spring no gestiona las transacciones directamente, sino a través de un administrador de transacciones.

Spring proporciona una interfaz PlatformTransactionManager, que se llama administrador de transacciones de Spring. Su código fuente es el siguiente:

El código fuente de esta interfaz es muy simple. Esta interfaz proporciona diferentes clases de implementación para diferentes marcos, como se muestra a continuación:

Nota: Estas clases de implementación deben importarse para ver las dependencias correspondientes. Hay otros dos objetos en la interfaz: TransactionDefinition y TransactionStatus.

El método se describe a continuación. AbstractTransactionStatus tiene una lógica de implementación específica para TransactionExecution, savepoint y SavepointManager. El código es demasiado, así que no lo publicaré, pero es fácil de entender. TransactionExecution, savepoint y SavepointManager tienen una lógica de implementación específica. El código es demasiado, así que no lo publicaré, pero es fácil de entender. DefaultTransactionStatus hereda de AbstractTransactionStatus y continúa extendiéndose.

El comportamiento de propagación de transacciones se refiere a cómo se deben administrar las transacciones durante el proceso de llamar a múltiples métodos de transacción. Por ejemplo, cuando el método de transacción A llama al método de transacción B, el comportamiento de propagación de la transacción del método de transacción B determinará si el método B se ejecuta dentro de la transacción del método A que llama o si abre una nueva transacción por sí mismo.

Método de transacción: método para realizar cambios en los datos de la tabla de la base de datos, como agregar, eliminar o modificar datos.

Basándonos en la descripción anterior, podemos dividir los comportamientos en tres categorías principales.

Las transacciones tienen propiedades de aislamiento y no habrá ningún impacto entre múltiples operaciones de transacción. Sin embargo, si no se considera el aislamiento, surgen tres problemas de lectura: lecturas sucias, lecturas no repetibles y lecturas virtuales (fantasmas).

Veamos qué pasa sin transacciones. Cree un paquete llamado aopxml.

En esta clase se proporcionan dos métodos, uno es aumentar la cantidad para Zhangsan y el otro es disminuir la cantidad para Lisan.

La estructura del proyecto es la siguiente:

Excepción en la consola

Verifique los datos de la base de datos nuevamente, puede encontrar que la cantidad de Zhang San ha aumentado, pero Li El importe de Si no tiene ninguna reducción. ¡El banco está llorando! ! ! ! Entonces necesitamos introducir transacciones Spring para resolver los problemas anteriores.

Configure la implementación del administrador de transacciones de las implementaciones de la interfaz DataSourceTransactionManager, JDBC y MBatis PlatformTransactionManager.

Configurar las notificaciones de transacciones, especificando el administrador de transacciones a utilizar y los métodos y propiedades de la transacción.

El valor predeterminado del parámetro del administrador de transacciones (transaction-manage) es transactionManager. Si la identificación del administrador de transacciones es la misma, no es necesario especificarla. Este elemento contiene varios parámetros de atributo que definen las propiedades de la transacción para uno o más métodos (aquellos especificados por el atributo de nombre), como se muestra en la siguiente tabla:

Escriba una transacción que administre el método de transporte como se describe arriba. No habrá ninguna situación en la que Ming reduzca el saldo y Hong no lo aumente, y la excepción se revertirá.

Con las anotaciones, no es necesario configurar lo anterior de una manera tan trivial. Recrearemos el paquete llamado txannon y copiaremos el código de las entidades, canales y servicios utilizados en el xml.

Utilice la anotación EnableTransactionManagement para habilitar transacciones.

Equivalente a la etiqueta tx:annotation-driven.

Esto elimina la necesidad de configurar puntos y aspectos de entrada.

Agregar la anotación @Transactional a un método que requiere procesamiento de transacciones indica que el método requiere procesamiento de transacciones.

La anotación @Transactional se puede agregar a una clase o método. Si agrega la anotación @Transactional a una clase, las transacciones se agregan a todos los métodos de la clase; si agrega la anotación @Transactional a un método, se agrega una transacción a ese método.

Transaccional Esta anotación puede configurar una gran cantidad de parámetros relacionados con transacciones.

El uso básico es ver el comportamiento de propagación de las transacciones, lo cual es una parte difícil de entender de las transacciones Spring porque tiene muchos escenarios de aplicación.

Si hay una transacción en ejecución, el método actual se ejecutará en esa transacción; de lo contrario, iniciará una nueva transacción y se ejecutará en su propia transacción.

Se debe iniciar el método actual una nueva transacción y ejecutarla en su propia transacción. Si se está ejecutando una transacción, se debe suspender.

El comportamiento de los métodos de restauración se ha cambiado a Propagation.REQUIRES_NEW. El método de transporte crea una nueva transacción y luego llama al método de restauración, que suspende la transacción del método de transporte y crea una transacción que pertenece al método de restauración. Por lo tanto, en este ejemplo se crean dos transacciones. Dado que hay dos transacciones, existen varios escenarios para revertir la transacción.

Las operaciones realizadas por el método de transferencia no se revierten, pero las operaciones realizadas por el método de restauración sí se revierten.

Si hay una transacción (transacción principal), se crea una nueva transacción que se ejecuta como una transacción anidada (subtransacción) de la transacción actual, si no hay ninguna transacción, el valor es igual a REQUIRED;

Una reversión anormal en el método de transporte hará que el método de restauración se revierta al mismo tiempo.

Las operaciones realizadas mediante métodos de transferencia no se revierten; las operaciones realizadas mediante métodos de restauración sí lo hacen. NOTA: El método de transporte requiere una captura; de lo contrario, el método de transporte también se revertirá.

Cuando el método de transacción principal se revierte debido a una excepción, la subtransacción también se revierte. Las subtransacciones pueden revertirse sin afectar la transacción principal u otras subtransacciones (siempre que se haya manejado la excepción de la subtransacción)

Si la transacción actual existe, se agregará a la transacción; si no es la transacción actual, se generará una excepción; ser arrojado.

Dado que el método de transporte no tiene transacción, generará una excepción al iniciar, de la siguiente manera:

Si hay una transacción en ejecución, el método actual se ejecuta en la transacción; no hay una transacción actual, el método se ejecuta como una no transacción.

Dado que el método de transporte no tiene una transacción, el método de restauración no crea una transacción y no retrocede en caso de una excepción.

Si hay una transacción actual, la ejecución en modo no transaccional suspenderá la transacción.

El método de transporte tiene una transacción, pero el comportamiento de la propagación del método de restauración es NOT_SUPPORTED, por lo que la transacción del método de transporte se suspende y el método de restauración se ejecuta de forma no transaccional.

Entonces, en el ejemplo de la imagen, las operaciones en el método de transferencia se revertirán, pero las operaciones en el método de restauración no se revertirán.

Si actualmente existe una transacción, ejecutarla en modo no transaccional generará una excepción.

Dado que el método de transporte es transaccional, generará una excepción al inicio, como se muestra a continuación:

Hemos estado analizando la reversión de excepciones, pero ¿revertiremos todas las excepciones? No, de forma predeterminada, las transacciones de Spring solo se revertirán cuando encuentren RuntimeException y Error, y no cuando encuentren excepciones marcadas como IOException y TimeoutException.

Si desea revertir cuando encuentre una excepción marcada, puede usar el atributo rollbackFor, que se configura de la siguiente manera:

Del mismo modo, si encuentra una excepción pero no desea para revertir, use el atributo noRollbackFor, configurado de la siguiente manera:

Si desea revertir cuando ocurre una excepción marcada, use el atributo noRollbackFor, configurado de la siguiente manera.