Spring utiliza anotaciones para la gestión de transacciones
Pasos de uso:
Comportamiento de propagación de transacciones y nivel de aislamiento
Al utilizar la gestión de transacciones de anotaciones de Spring, todos deben prestar atención al comportamiento de propagación de transacciones y al nivel de aislamiento. Es posible que se sienta un poco abrumado, por lo que lo presentaré en detalle a continuación para facilitar su consulta.
Método de anotación de transacción: @Transactional
Cuando se marca delante de una clase, indica que todos los métodos de la clase realizan procesamiento de transacciones. Ejemplo:
Cuando. un determinado método en la clase Cuando estos métodos no requieren transacciones:
Configuración del tiempo de espera de la transacción:
@Transactional(timeout=30) //El valor predeterminado es 30 segundos
Nivel de aislamiento de transacción:
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
Leer datos no confirmados (se producirán lecturas sucias, lecturas no repetibles), básicamente no utilizados p>
@Transactional( aislamiento = Isolation.READ_COMMITTED)
Leer datos confirmados (se producirán lecturas no repetibles y lecturas fantasmas)
@Transactional(isolation = Isolation.REPEATABLE_READ )
Lectura repetible (se producirán lecturas fantasmas)
@Transactional(isolation = Isolation.SERIALIZABLE)
Serialización
MYSQL: predeterminado es el nivel REPEATABLE_READ
SQLSERVER: el valor predeterminado es READ_COMMITTED
Lectura sucia: una transacción lee datos actualizados no confirmados de otra transacción
Lectura no repetible: en el mismo transacción, leer los mismos datos varias veces arroja resultados diferentes. En otras palabras,
las lecturas posteriores pueden leer datos actualizados que han sido confirmados por otra transacción, a diferencia de las "lecturas repetibles" dentro de la misma transacción. datos varias veces
, se puede garantizar que los datos leídos sean los mismos, es decir, las lecturas posteriores no pueden leer datos actualizados que hayan sido enviados por otra transacción
Lectura fantasma: una transacción leer Insertar datos enviados por otra transacción
Descripción de parámetros comunes en la anotación @Transactional
Tabla continuación)
Varios puntos a tener en cuenta:
1 @Transactional solo se puede aplicar a métodos públicos. Para otros métodos no públicos, si @Transactional está marcado, no se informará ningún error, pero el método no tiene función de transacción.
2. Utilice Administrador de transacciones de Spring, Spring es responsable de abrir, enviar y revertir la base de datos. De forma predeterminada, retrocederá cuando encuentre una excepción de tiempo de ejecución (lanzará una nueva RuntimeException ("comentario");), es decir, retrocederá cuando no esté marcada. se encuentra una excepción cuando se encuentra una excepción que debe detectarse (lanzar una nueva excepción ("comentario");), no habrá reversión, es decir, cuando se encuentra una excepción marcada (es decir, una excepción lanzada durante la no ejecución). En tiempo de ejecución, la excepción que verificará el compilador se llama excepción marcada (o excepción marcada), debemos especificar una forma de revertir la transacción. Si queremos que se reviertan todas las excepciones, debemos agregar @Transactional(rollbackFor=). {Exception.class, otras excepciones}). Si la excepción no marcada no se revierte, Roll: @Transactional(notRollbackFor=RunTimeException.class)
de la siguiente manera:
@Tr
ansactional(rollbackFor=Exception.class) //Especifique la reversión y la reversión cuando encuentre una excepción
public void MethodName() {
throw new Exception("Comment");
}
@Transactional(noRollbackFor=Exception.class)// Especifique no revertir y retrocederá cuando encuentre una excepción de tiempo de ejecución (lanzar una nueva RuntimeException("Comment");) p>
public ItimDaoImpl getItemDaoImpl() {
throw new RuntimeException("annotation");
}
3. La anotación @Transactional solo debe aplicarse a métodos con visibilidad pública. Si utiliza la anotación @Transactional en un método protegido, privado o visible para el paquete, no informará un error, pero el método anotado no mostrará las configuraciones de transacción configuradas.
4. La anotación @Transactional se puede aplicar a definiciones de interfaz y métodos de interfaz, definiciones de clases y métodos públicos de clases. Sin embargo, tenga en cuenta que la mera presencia de la anotación @Transactional no es suficiente para habilitar el comportamiento transaccional; son simplemente metadatos que pueden ser utilizados por beans configurados apropiadamente con comportamiento transaccional que reconocen la anotación @Transactional y lo anterior. En el ejemplo anterior, en realidad es la apariencia del elemento lo que inicia el comportamiento de la transacción.
5. La sugerencia del equipo de Spring es que use la anotación @Transactional en una clase específica (o método de clase) en lugar de usarla en cualquier interfaz que la clase quiera implementar. . Por supuesto, puede utilizar la anotación @Transactional en las interfaces, pero esto sólo tendrá efecto si configura un proxy basado en interfaz. Debido a que las anotaciones no se heredan, esto significa que si está utilizando un proxy basado en clases, el proxy basado en clases no reconocerá la configuración de la transacción y el proxy de transacciones no empaquetará el objeto (se confirmará en casos graves). ). Por lo tanto, siga el consejo del equipo de Spring y utilice la anotación @Transactional en clases específicas.