Transacción de primavera (Transacción)

Las transacciones tienen cuatro características: atomicidad, consistencia, aislamiento y durabilidad, denominadas características ACID.

  • Atomicidad: una transacción es una unidad de trabajo indivisible y todas las acciones incluidas en la transacción se realizan o no se realiza ninguna.
  • Consistencia: las transacciones deben garantizar que la base de datos cambie de un estado de coherencia a otro. La coherencia y la atomicidad están estrechamente relacionadas.
  • Aislamiento: la ejecución de una transacción no puede ser interferida por otras transacciones, es decir, las operaciones y los datos utilizados dentro de una transacción están aislados de otras transacciones concurrentes y las transacciones ejecutadas simultáneamente no pueden interferir entre sí.
  • Durabilidad: La durabilidad, también conocida como permanencia, significa que una vez que se confirma una transacción, sus cambios en los datos de la base de datos son permanentes y otras operaciones y fallas posteriores no deberían tener ningún impacto en ella.

Las transacciones nos permiten combinar varias operaciones o un grupo de operaciones en una unidad de trabajo que tiene éxito o fracasa. Si todas las operaciones de la transacción se ejecutan correctamente, todo estará bien. Pero si alguna operación de la transacción falla, todas las operaciones de la transacción se revertirán y las operaciones exitosas se borrarán por completo, como si nada hubiera pasado.

En el mundo real, probablemente el ejemplo más común relacionado con una transacción sea una transferencia bancaria. Supongamos que necesitamos transferir 1000 yuanes de la cuenta A a la cuenta B. Esta operación de transferencia implica las dos operaciones siguientes.

  • Deducir 100 yuanes de la cuenta A;
  • Deposite 100 yuanes en la cuenta B.

Si la cuenta A deduce exitosamente 100 yuanes, pero no deposita 100 yuanes en la cuenta B, entonces perderemos 100 yuanes de la nada; si la cuenta A no deduce 100 yuanes, pero deposita exitosamente 100 yuanes en la cuenta B, perderemos 100 yuanes de la nada: si se agregan 100 yuanes adicionales a su cuenta de la nada, el banco sufrirá pérdidas. Por lo tanto, debemos asegurarnos de que todas las operaciones de la transacción tengan éxito o fracasen. Entendiendo esto, comprenderemos el núcleo de la transacción.
 

estilo de gestión de transacciones

Spring admite los siguientes dos métodos de gestión de transacciones.

estilo de gestión de transacciones ilustrar
Gestión programática de transacciones La gestión de transacciones programática es la gestión de transacciones implementada mediante la escritura de código.

Este método puede definir con precisión los límites de la transacción en el código y podemos especificar dónde comienza y dónde termina la transacción de acuerdo con los requisitos.
Gestión de transacciones declarativas La gestión de transacciones declarativas de Spring utiliza tecnología AOP en la parte inferior. Su mayor ventaja es que no es necesario gestionar las transacciones mediante programación, solo necesita declarar las reglas relevantes en el archivo de configuración para aplicar las reglas de transacción a la lógica empresarial.

La elección entre transacciones programáticas y transacciones declarativas es en gran medida una compensación entre control detallado y facilidad de uso.

  • El control programático de las cosas es más detallado. Podemos controlar con precisión los límites de las transacciones. El inicio y el final de una transacción dependen completamente de nuestras necesidades. Sin embargo, este método tiene un defecto fatal, es decir, el acoplamiento de las reglas de transacción y código comercial Alto grado de complejidad y difícil de mantener, por lo que rara vez utilizamos este método para gestionar transacciones.
  • Las transacciones declarativas son más fáciles de usar, no son intrusivas para el código comercial, tienen un bajo acoplamiento y son fáciles de mantener, por lo que este método también es nuestro método de gestión de transacciones más utilizado.

La gestión de transacciones declarativas de Spring se implementa principalmente de las dos formas siguientes:
Gestión de transacciones declarativas basada en XML
Gestión de transacciones declarativas basada en anotaciones

administrador de transacciones

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

Spring proporciona una interfaz org.springframework.transaction.PlatformTransactionManager. Esta interfaz se llama administrador de transacciones de Spring. Su código fuente es el siguiente

public interface PlatformTransactionManager extends TransactionManager {
    TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
    void commit(TransactionStatus status) throws TransactionException;
    void rollback(TransactionStatus status) throws TransactionException;
}

Cada método en esta interfaz se describe a continuación:

nombre ilustrar
TransactionStatus getTransaction(definición de TransactionDefinition) Se utiliza para obtener información sobre el estado de la transacción.
confirmación nula (estado de estado de transacción) Se utiliza para realizar transacciones.
 reversión nula (estado de estado de transacción) Se utiliza para revertir transacciones

Spring proporciona diferentes implementaciones de la interfaz PlatformTransactionManager para diferentes marcos o plataformas de persistencia (como JDBC, Hibernate, JPA, JTA, etc.) Estas clases de implementación se denominan implementaciones del administrador de transacciones.

Clase de implementación ilustrar
org.springframework.jdbc.datasource.DataSourceTransactionManager Se utiliza cuando se utiliza Spring JDBC o iBatis para conservar datos.
org.springframework.orm.hibernate3.HibernateTransactionManager Se utiliza cuando se utiliza Hibernate 3.0 y superior para conservar datos.
org.springframework.orm.jpa.JpaTransactionManager Se utiliza cuando se utiliza JPA para persistencia.
org.springframework.jdo.JdoTransactionManager Se utiliza cuando el mecanismo de persistencia es Jdo.
org.springframework.transaction.jta.JtaTransactionManager Utilice JTA para implementar la gestión de transacciones y utilice esta implementación cuando una transacción abarque varios recursos diferentes (es decir, transacciones distribuidas).

Interfaz TransactionDefinition

Spring encapsula la información de la transacción en la configuración XML en el objeto TransactionDefinition, luego obtiene el estado de la transacción (TransactionStatus) a través del método getTransaction () del administrador de transacciones y realiza la siguiente operación en la transacción.

La interfaz TransactionDefinition proporciona métodos para obtener información relacionada con transacciones. La interfaz se define de la siguiente manera.

public interface TransactionDefinition {
    int getPropagationBehavior();
    int getIsolationLevel();
    String getName();
    int getTimeout();
    boolean isReadOnly();
}

Los métodos en esta interfaz se describen a continuación.

método ilustrar
Cadena getName() Obtener el nombre de la transacción
int getIsolationLevel() Obtener el nivel de aislamiento de una transacción
int getPropagationBehavior() Obtener el comportamiento de propagación de transacciones
int getTimeout() Obtener tiempo de espera de transacción
booleano esReadOnly() Obtenga si la transacción es de solo lectura

nivel de aislamiento de transacciones

El nivel de aislamiento de una transacción define hasta qué punto una transacción puede verse afectada por otras transacciones simultáneas.

En aplicaciones prácticas, a menudo ocurre que múltiples transacciones realizan diferentes operaciones con los mismos datos al mismo tiempo para lograr sus respectivas tareas. En este momento, pueden ocurrir problemas como lecturas sucias, lecturas fantasma y lecturas no repetibles.

En un mundo ideal, donde las transacciones están completamente aisladas, los problemas anteriores, naturalmente, no surgirán. Sin embargo, el aislamiento completo de las transacciones puede causar problemas de rendimiento y no todas las aplicaciones requieren un aislamiento completo de las transacciones, por lo que a veces las aplicaciones también tienen cierta flexibilidad en el aislamiento de las transacciones.

Spring proporciona los siguientes niveles de aislamiento: podemos elegir el nivel de aislamiento adecuado según nuestras propias necesidades.

método ilustrar
ISOLATION_DEFAULT Utilice el nivel de aislamiento predeterminado de la base de datos backend
ISOLATION_READ_UNCOMMITTED Permite la lectura de cambios no confirmados, lo que puede dar lugar a lecturas sucias, lecturas fantasma y lecturas no repetibles.
ISOLATION_READ_COMMITTED El nivel predeterminado de Oracle permite la lectura de transacciones simultáneas comprometidas, evitando lecturas sucias, posibles lecturas fantasmas y lecturas no repetibles.
ISOLATION_REPEATABLE_READ Nivel predeterminado de MySQL, los resultados de leer el mismo campo varias veces son consistentes, lo que evita lecturas sucias y no repetibles, y posibles lecturas fantasmas.
ISOLATION_SERIALIZABLE Cumplir totalmente con el nivel de aislamiento ACID para evitar lecturas sucias, lecturas no repetibles y lecturas fantasmas.

comportamiento de comunicación de transacciones

El comportamiento de propagación de transacciones se refiere a cómo debe ejecutarse un método de transacción cuando otro método de transacción lo llama. 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 determina si el método B continúa ejecutándose en la transacción del método llamador A o inicia una nueva transacción por sí mismo.

Los métodos de transacción se refieren a métodos que pueden cambiar los datos de la tabla de la base de datos, como métodos para agregar datos, eliminar datos y modificar datos.

Spring proporciona los siguientes 7 comportamientos diferentes de propagación de transacciones.

nombre ilustrar
PROPAGACIÓN_MANDATORIA Admite transacciones actuales y genera una excepción si no existe ninguna transacción actual.
PROPAGATION_NESTED Si la transacción actual existe, ejecútela dentro de la transacción anidada.
PROPAGACIÓN_NUNCA La transacción actual no es compatible y se genera una excepción si la transacción actual existe.
PROPAGATION_NOT_SUPPORTED Las transacciones actuales no son compatibles y siempre se ejecutan de forma no transaccional.
PROPAGACIÓN_REQUIRED El comportamiento de propagación predeterminado es que si la transacción actual existe, el método actual se ejecutará en la transacción actual. Si no existe, se creará una nueva transacción y se ejecutará en la nueva transacción.
PROPAGATION_REQUIRES_NEW Cree una nueva transacción o suspenda la transacción actual si ya existe una.
SOPORTES_PROPAGACIÓN Se admite la transacción actual y, si no existe ninguna transacción, se ejecuta de forma no transaccional.

Interfaz de estado de transacción

La interfaz TransactionStatus proporciona algunos métodos simples para controlar la ejecución de transacciones y consultar el estado de las transacciones. La interfaz se define de la siguiente manera.

public interface TransactionStatus extends SavepointManager {
    boolean isNewTransaction();
    boolean hasSavepoint();
    void setRollbackOnly();
    boolean isRollbackOnly();
    boolean isCompleted();
}

Cada método en esta interfaz se describe a continuación.

nombre ilustrar
booleano tieneSavepoint() Obtener si existe un punto de guardado
booleano está completado() Obtenga si la transacción se completó
booleano esNuevaTransacción() Obtener si se trata de una nueva transacción
booleano esRollbackOnly() Obtener si la transacción se revierte
conjunto vacíoRollbackOnly() Establecer reversión de transacciones
 

Supongo que te gusta

Origin blog.csdn.net/qq_43079001/article/details/132232578
Recomendado
Clasificación