Spring Framework gestión de transacciones

El problema

1. ¿Qué es una transacción?

2. ¿Cuál es el propósito de la transacción?

Transacción de base de datos

La gestión de transacciones subyacente de Spring se basa en las transacciones de la base de datos, por lo que antes de aprender las transacciones de Spring, primero debemos aprender las transacciones de la base de datos.

Definición de transacción

La transacción es una unidad lógica en el proceso de ejecución del sistema de gestión de la base de datos, que consiste en una secuencia limitada de operaciones de la base de datos. (De Wikipedia)

Una traducción simple es combinar las operaciones paso a paso de acceder a los recursos de datos en una operación completa, y esta unidad de ejecución completa es una transacción .

El propósito de la transacción.

El propósito de la transacción es asegurar la consistencia de los datos.

Características de las transacciones.

Para garantizar que la operación paso a paso se combine en una operación general, el éxito general o el fracaso general (la misma vida y muerte) Tiene que haber una definición estricta.

Las cuatro características de las transacciones (ACID) : atomicidad (Atomicity), consistencia (Consistencia), aislamiento (Aislamiento), durabilidad (Durabilidad).

  1. Atomicidad: las operaciones múltiples de la misma transacción son unidades mínimas indivisibles. Cuando todas las operaciones se ejecutan con éxito, la transacción se envía, de lo contrario, todas las operaciones exitosas se cancelan y la base de datos se restaura al estado inicial.
  2. Consistencia: después de enviar la transacción, los resultados de los datos son consistentes con las reglas de expectativas comerciales. Por ejemplo, no importa si la transacción se envió correctamente o no, el total de las dos cuentas no cambia.
  3. Aislamiento: existe un aislamiento entre transacciones y transacciones durante las operaciones concurrentes, y no interfieren entre sí. El aislamiento depende del nivel de aislamiento de la base de datos.
  4. Persistencia: después de que la transacción se envíe con éxito, una serie de operaciones en la transacción se mantendrá en la base de datos.

Nivel de aislamiento de transacción

  1. Lectura no confirmada: una transacción puede leer otro contenido no confirmado. Puede haber "lectura sucia", "lectura no repetible", "lectura fantasma".
  2. Confirmar lectura: una transacción solo puede leer el contenido de otros datos que se han enviado correctamente. Puede haber "lectura no repetible" y "lectura fantasma". El nivel de aislamiento predeterminado para la mayoría de las bases de datos.
  3. Lectura repetible: los mismos datos se leen varias veces durante la transacción. Puede aparecer "Lectura mágica". Nivel predeterminado de Mysql.
  4. Serialización: todas las operaciones de transacción deben realizarse en secuencia. El nivel de aislamiento más estricto.

Problemas de concurrencia de datos

  1. Lectura sucia : la transacción 1 actualiza los datos, pero no se confirma, pero la transacción 2 puede leer el contenido no confirmado. Cuando la transacción revierte los datos no confirmados, la transacción 2 se lee antes.
  2. Lectura no repetible : la misma transacción lee los mismos datos varias veces, y el resultado de cada lectura es diferente. La transacción 1 lee los datos antes y después de la operación de actualización de la transacción 2, y los dos resultados serán diferentes.
  3. Lectura mágica : la misma transacción realiza múltiples consultas en el mismo conjunto de datos, y el conjunto de resultados es diferente cada vez . La transacción 1 lee los datos antes y después de la operación de inserción o eliminación de la transacción 2 , y el conjunto de resultados de la operación es diferente.

Motivo de la lectura sucia: la operación "select" no está restringida

Motivo de la lectura no repetible: la operación de "actualización" no está limitada

Razones para la lectura fantasma: las operaciones "insertar" y "eliminar" no están restringidas

El efecto del nivel de aislamiento de la transacción en los problemas de concurrencia de datos

  1. Lea el papel no comprometido: sin efecto.
  2. Envío de lectura: El uso de "lectura de instantánea" puede evitar "lectura sucia", pero no puede evitar "lectura no repetible" y "lectura fantasma".
  3. Lecturas repetibles: utilice "lecturas de instantáneas" para evitar "lecturas sucias" y "lecturas no repetibles", pero no "lecturas mágicas".
  4. Serialización: puede evitar "lectura sucia", "lectura no repetible", "lectura fantasma".

Instantánea leída

La lectura de instantáneas se basa en la implementación de registro de deshacer y MVCC, adecuada para declaraciones de selección simples. El control de versión concurrente de MVCC se logra mediante ReadView (vista de transacción).

Se ha enviado la lectura: cada SQL en la transacción generará un ReadView. El valor en el último ReadView se leerá durante la operación de consulta.

Lectura repetible: se genera un ReadView cuando comienza la transacción. Varios SQL en la transacción leerán el mismo ReadView. El valor en el mismo ReadView también se leerá en múltiples consultas SQL.

Gestión de transacciones de primavera

Spring proporciona una plantilla de programación unificada para la gestión de transacciones y establece una abstracción de transacciones unificadas a un alto nivel.

Interfaz de gestión de transacciones

TransactionDefinition

Se utiliza para describir los atributos específicos de la transacción, como el nivel de aislamiento de la transacción, el período de tiempo de espera, si se trata de una transacción de lectura y las reglas de propagación de la transacción.

Nivel de aislamiento de transacción

En TransactionDefinition, se definen cinco constantes que representan el nivel de aislamiento:

(1) TransactionDefinition.ISOLATION_DEFAULT, lo que significa que se usa el sector de aislamiento predeterminado de la base de datos (Oracle usa el envío de lectura, Mysql usa lecturas repetibles por defecto)

(2) TransactionDefinition.ISOLATION_READ_UNCOMMITTED, que indica que la lectura no se envió.

(3) TransactionDefinition.ISOLATION_READ_COMMITTED, que significa leer y enviar.

(4) TransactionDefinition.ISOLATION_REPEATABLE_READ, que puede leerse repetidamente.

(5) TransactionDefinition.ISOLATION_SERIALIZABLE, que significa serialización.

Comportamiento de propagación de transacciones

Cuando otra transacción llama a una transacción, debe especificar la propagación de la transacción.

TransactionDefinition.PROPAGATION_REQUIRED, si actualmente hay una transacción, únete a la transacción; si no hay transacción, crea una nueva transacción, esta es la opción más común.

TransactionDefinition.PROPAGATION_SUPPORTS, si actualmente hay una transacción, únase a la transacción; si no hay una transacción, continúe ejecutándose de manera no transaccional.

TransactionDefinition.PROPAGATION_MANDATORY, si actualmente hay una transacción, únete a la transacción; si actualmente no hay ninguna transacción, lanza una excepción.

Tiempo de espera de transacción

Supere el tiempo en que se permite que la transacción se ejecute, la transacción se revertirá automáticamente si la transacción no se completa dentro del tiempo especificado. La unidad predeterminada en TransactionDefinition es segundos.

Estado de solo lectura

La transacción solo lee los recursos de la transacción y no modifica ningún dato. Si solo lee los datos de recursos de la transacción, puede configurarlos en estado de solo lectura para mejorar el rendimiento de ejecución.

Reglas de reversión

Se usa para definir las excepciones correspondientes para la reversión y no la reinversión. De forma predeterminada, las transacciones se retrotraen solo cuando encuentran excepciones específicas durante el tiempo de ejecución.

Estado de la transacción

Se utiliza para indicar el estado de ejecución específico de la transacción. El administrador de transacciones puede obtener la información de estado del tiempo de ejecución de la transacción a través de esta interfaz, y también puede revertir la transacción indirectamente a través de esta interfaz, lo que es más significativo que deshacer la transacción cuando se produce una excepción.

PlatformTransactionManager

Administrador de transacciones, proporcionar confirmación de transacción, revertir y devolver una transacción existente o crear una nueva transacción desde el entorno de transacción de acuerdo con la información de definición de transacción.

<!-- 事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource" />
	</bean>

Referencia

[1] https://zh.wikipedia.org/wiki/Database transacción

[2] https://baijiahao.baidu.com/s?id=1611918898724887602&wfr=spider&for=pc

[3] https://www.cnblogs.com/AlmostWasteTime/p/11466520.html

[4] https://juejin.im/post/5b00c52ef265da0b95276091

[5] "Mastering Spring4.x Enterprise Application Development Combat"

Supongo que te gusta

Origin www.cnblogs.com/boycelee/p/12688939.html
Recomendado
Clasificación