En Spring Boot Transaction Management, implementa la plataforma de auto-interfaz de selfTransactionManager.
Public Interface PlatformTransactionManager {org.springframework.transaction.transactionStatus getTransaction (org.springframework.transaction.transactionDefinition TransactionDefinition) arroja org.springframework.transaction.transactionException; void commit (org.springframework.transaction.transactionstatus transactionstatus) lanza org.springframework.transaction.transactionException; Void Rollback (org.springframework.transaction.transactionstatus transactionstatus) lanza org.springframework.transaction.transactionException;}Cuando usamos la dependencia Spring-Boot-Starter-JDBC, el marco inyectará automáticamente DataSourCetransactionManager de forma predeterminada. Por lo tanto, no necesitamos ninguna configuración adicional para usar la anotación @Transactional para el uso de la transacción.
JDBC Transaction Manager
En el servicio, el método anotado por @Transactional admitirá transacciones. Si la anotación está en una clase, todos los métodos de toda la clase respaldan las transacciones de forma predeterminada.
Situación del administrador de transacciones múltiples
1: puede implementar la interfaz de transacciones ganagementConfigurer, y el valor de retorno del método dentro es el administrador de transacciones predeterminado.
2: puede establecer el valor en el método de ejecución específico
Si hay múltiples instancias de PlatformTransactionManager en el contenedor Spring y el Conface TransactionManagement Configurer no se implementa para especificar el valor predeterminado, cuando usamos la anotación @Transactional en el método, debemos especificarlo con valor. Si no se especifica, se lanzará una excepción.
//@enableTransactionManagement // Activa la gestión de transacciones de anotación, que es equivalente a <tx: anotación-conducido />@springbootapplicationpublic clase perfiledemoApplication implementa la gestión de transacciones configurante {@resource (name = "txManager2") private PlataformatransactionManager txmanager2; // Crear manualmente el administrador de transacciones 1 El marco de la fuente de datos se inyectará automáticamente // En el contenedor de primavera, anotamos manualmente @Bean se cargará primero, y el marco no volverá a insincrar en otras clases de implementación de PlatformTransactionManager. @Bean (name = "txManager1") Public PlatformTransactionManager TXManager (DataSource DataSource) {return New DataSourCetransactionManager (DataSource); } // Crear transaccionManager 2 @Bean (name = "TXManager2") PublicTransactionManager TXManager2 (EntityManagerFactory Factory) {return New JPatransactionManager (fábrica); } // Implementar el método Interface TransactionManagementConfigurer cuyo valor de retorno representa el administrador de transacciones utilizado por defecto si tiene múltiples administradores de transacciones @Override PublicTransactionManager AnnotationDriventRansactionManager () {return txManager2; } public static void main (string [] args) {springapplication.run (perfiledemoapplication.class, args); }}Implementación específica
@ComponentPublic Class DevSendMessage implementa SendMessage {// Use el valor para especificar qué administrador de transacciones usar @Transactional (value = "txManager1") @Override public void send () {System.out.println (">>>>>>>>>> DEVEND SEND () <<<<<<<< ulo send2 (); } @Transactional public void send2 () {System.out.println (">>>>>>>>>>>> dev send2 () <<<<<<<<ólogo); }}Nivel de aislamiento
Public Enum Aislation {default (transaccionDefinition.isolation_default), read_uncommited (transaccionDefinition.isolation_read_uncommits), read_commited (transaccionDefinition.isolation_read_commited), repetible_read (transaccionDefinition.isolation_Repeatable_read),, Serializable (TransactionDefinition.Isolation_Serializable); Valor privado final final; Aislamiento (valor int) {this.value = value; } public int value () {return this.Value; }} Método de especificación: Establecer utilizando la propiedad de aislamiento, por ejemplo:
@Transactional (aislamiento = aislamiento.default)
Comportamiento de comunicación
El llamado comportamiento de propagación de la transacción se refiere a que si ya existe un contexto de transacción antes de que se inicie la transacción actual, hay varias opciones que pueden especificar el comportamiento de ejecución de un método transaccional.
Podemos ver que el org.springframework.transaction.annotation.propagation enumeración clase define 6 valores de enum que representan el comportamiento de propagación:
Propagation public enum {requerido (TransactionDefinition.Propagation_Required), admite (TransactionDefinition.Propagation_Supports), obligatorio (TransactionDefinition.Propagation_Mandatory), Requiere_New (TransactionDefinition.Propagation_Requires_new),,, Not_Supported (TransactionDefinition.Propagation_Not_Supported), nunca (transaccionesDefinition.Propagation_Never), anidadas (transaccionDefinition.Propagation_Nested); Valor privado final final; Propagation (int value) {this.value = value; } public int value () {return this.Value; }}Requerido: si actualmente está presente una transacción, une a la transacción; Si actualmente no hay transacción, cree una nueva transacción. valor predeterminado.
Soporte: si actualmente una transacción está presente, une a la transacción; Si actualmente no hay transacción, continúe ejecutándose de manera no transaccional.
Obligatorio: si actualmente una transacción está presente, une a la transacción; Si actualmente no hay transacción, se lanza una excepción. (Obligado a ponerlo en la transacción)
Requerir_New: Crea una nueva transacción, y si la transacción existe actualmente, la transacción actual se suspenderá. (Los registros de impresión a menudo se usan. Incluso si la reversión anterior se retrocede, la transacción se ejecutará y se registrará el mensaje de error)
No_supportado: se ejecuta de manera no transaccional. Si actualmente existe una transacción, la transacción actual se suspenderá.
Nunca: se ejecuta de manera no transaccional, lanza una excepción si actualmente existe una transacción.
Anidados: si actualmente existe una transacción, se crea una transacción para ejecutarse como una transacción anidada de la transacción actual; Si no hay transacción actualmente, el valor es equivalente al requerido.
Método de especificación: Establecer utilizando la propiedad de propagación, por ejemplo:
@Transactional (propagation = propagation.Required)
Transacción no una situación de reversión
Revuelve solo si ocurre una no captura RuntimeException
La excepción presentada por captura será exitosa cuando ambos se insertaran
@Override @Transactional Public void InsertAndInsert (personal del personal) {Staffdao.insert (personal); intente {int i = 1/0; } catch (Exception e) {E.PrintStackTrace (); } Staffdao.insert (personal); }Agregado a la declaración de captura del método de capa de servicio: TransactionSpectsupport.CurrentTransactionStatus (). SetRollbackOnly (); Declaración, la reversión manual no insertará datos
@Override @Transactional public void InsertAndInsert (personal del personal) arroja excepción {try {staffdao.insert (personal); int i = 1/0; Staffdao.insert (personal); } Catch (Exception e) {TransActionSpectSupport.CurrentTransactionStatus (). SetRollbackOnly (); }}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.