Usar anotaciones en Spring para la gestión de transacciones
Pasos:
Comportamiento de propagación de transacciones y nivel de aislamiento
Cuando utiliza la gestión de transacciones de anotaciones de Spring, es posible que le preocupe el comportamiento de propagación de transacciones y el nivel de aislamiento. Es un poco abrumador, por lo que para facilitar la referencia se describe con más detalle a continuación.
Anotación de transacción: @Transactional
Cuando se marca delante de una clase, indica que todos los métodos de la clase son importantes, por ejemplo:
Cuando está en la clase Algunos métodos no necesitan ser importantes cuando:
Importa tiempo de espera.
Configuración del tiempo de espera de la transacción:
@Transactional(timeout=30) // El valor predeterminado es 30 segundos
Nivel de aislamiento de la transacción:
@ Transactional(isolation = Isolation READ_UNCOMMITTED)
La lectura de datos no confirmados (lectura sucia, lectura no repetible) básicamente no se utiliza
@Transactional(isolation = Isolation.READ_COMMITTED)
Leer datos confirmados (lectura no repetible y fantasma)
Leer datos confirmados (lectura no repetible y fantasma)
Nivel de aislamiento de transacción:
@Transactional(isolation = Isolation. y lectura fantasma)
@Transactional(isolation = Isolation.REPEATABLE_READ)
Lectura repetible (se produce lectura fantasma)
@ Transaccional(isolation = Isolation.SERIALIZABLE)
Serialización
MYSQL: el valor predeterminado es el nivel REPEATABLE_READ
SQLSERVER: el valor predeterminado es READ_COMMITTED
Lectura sucia : Una transacción lee datos de las actualizaciones no confirmadas de otra transacción
Lectura sucia: una transacción lee datos de las actualizaciones no confirmadas de otra transacción
Lectura repetible (puede ser lectura fantasma)
@Transactional(isolation = Isolation.Dirty read: una transacción lee actualizaciones no confirmadas de otra transacción
Lectura no repetible: leer los mismos datos varias veces dentro de la misma transacción arrojará resultados diferentes; en otras palabras, las lecturas posteriores pueden leer actualizaciones confirmadas de otra transacción. Las lecturas repetidas "garantizan que los mismos datos se pueden leer varias veces en la misma transacción
, es decir, las lecturas posteriores no pueden leer las actualizaciones enviadas por otra transacción
Lecturas fantasma: una transacción lee la inserción enviada por otra transacción
@ Anotación transaccional comúnmente utilizada
tabla de continuación)
Notas:
1 @Transactional solo se puede aplicar a métodos públicos. Otros métodos no públicos marcados con @Transactional no informarán un error. Transaccional no informará un error, pero este método no tiene función transaccional.
2 Con el administrador de transacciones de Spring, Spring es responsable de la apertura, envío y reversión de la base de datos. De forma predeterminada, se revertirá cuando se encuentre una excepción de tiempo de ejecución (lanzará una nueva RuntimeException ("comentario");), es decir, cuando se encuentre una excepción no marcada, necesitará detectar la excepción (lanzará una nueva excepción ("comentario"); ; ) no se revertirá, es decir, cuando se encuentre una excepción marcada (no se lanzará en tiempo de ejecución).
Cuando encontramos una excepción marcada (es decir, las excepciones que no se lanzan en tiempo de ejecución y son verificadas por el compilador se denominan excepciones marcadas o excepciones marcadas), debemos especificar una forma de transacción de reversión. Para revertir todas las excepciones necesitamos agregar @Transactional( rollbackFor={Exception.class, otherException}). Si no desea revertir las excepciones no marcadas, puede agregar @Transactional(notRollbackFor=RunTimeException.class)
Lo siguiente:
@Transactional(rollbackFor=Exception.class) //Especificar Revertir, revertir cuando se encuentra una excepción
public void nombre del método() {
throw new Exception("Comentario");
}
@Transactional(noRollbackFor=Exception.class)//Especifique no revertir. class) // No especifica ninguna reversión, se revertirá si encuentra una excepción de tiempo de ejecución (lanzar nueva RuntimeException("comment");)
public ItimDaoImpl getItemDaoImpl() {
lanzar nueva RuntimeException ("annotation");
}
3.
3. La anotación @Transactional debe aplicarse solo a métodos de visibilidad pública. Si utiliza la anotación @Transactional en un método protegido, privado o visible para el paquete, no generará 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, así como a definiciones de clases y métodos públicos de clases. Sin embargo, tenga en cuenta que la presencia de la anotación @Transactional no es suficiente para habilitar el comportamiento transaccional; son simplemente metadatos que pueden utilizar los beans que conocen la anotación @Transactional y están configurados adecuadamente para el comportamiento transaccional (como se describe anteriormente). . En el ejemplo anterior, es la presencia del elemento lo que permite el comportamiento transaccional.
5. El equipo de Spring recomienda utilizar la anotación @Transactional en una clase específica (o método de una clase) en lugar de en cualquier interfaz implementada por la clase. Por supuesto, puede utilizar la anotación @Transactional en una interfaz, pero sólo si está configurado un proxy basado en interfaz. Dado que las anotaciones no son heredables, 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, ni el objeto será encapsulado por el proxy de transacciones (será reconocido como una clave ). Por lo tanto, siga el consejo del equipo de Spring y utilice la anotación @Transactional en clases concretas.