1. Mecanismo de transacción de primavera
Todas las tecnologías de acceso a datos tienen mecanismos de procesamiento de transacciones, que proporcionan API para habilitar transacciones, confirmar transacciones para completar las operaciones de datos o retirar los datos cuando ocurre un error.
El mecanismo de transacción de Spring utiliza un mecanismo unificado para manejar transacciones de diferentes tecnologías de acceso a datos. El mecanismo de transacción de Spring proporciona una interfaz PlatformTransactionManager, y las transacciones de diferentes tecnologías de acceso a datos se implementan utilizando diferentes interfaces:
El código para definir un administrador de transacciones en un programa es el siguiente:
@Bean PublicTransactionManager TransActionManager () {JPatransactionManager TransActionManager = new JPatransActionManager (); transaccionManager.setDataSource (DataSource ()); return TransactionManager; }2. Transacciones declarativas
Spring admite transacciones declarativas, es decir, utilizando anotaciones para seleccionar el método que necesita usar transacciones. Utiliza la anotación @Transactional para indicar en el método que el método requiere soporte de transacción.
@Transactional public void saveSomething (ID de larga, nombre de cadena) {// Operación de la base de datos}Es importante tener en cuenta aquí que esta anotación @Transactional proviene de la Org.SpringFramework.Transaction.Annotation Package, no Javax.Transaction.
Spring proporciona una anotación @EnabletransactionManagement para permitir el soporte de transacciones declarativas en las clases de configuración. Después de usar @enabletransactionManagement, el contenedor de primavera escaneará automáticamente los métodos y clases anotadas @Transactional. @EnabletransactionManagement se usa de la siguiente manera:
@Configuration @enabletransactionManagement public class appconfig {}3. Use @Transactional a nivel de clase
@Transactional no solo puede anotar los métodos, sino también en las clases. Al anotar en una clase, significa que todos los métodos públicos de esta clase están activados por transacciones. Si el nivel de clase y el nivel de método usan la anotación @Transactional a nivel de clase, la anotación del nivel de método se sobrecargará utilizando el nivel de clase.
4. Soporte de transacción para datos de primavera JPA
Spring Data JPA habilita el soporte de transacción para todos los métodos predeterminados, y la propiedad ReadOnly = True está habilitada de forma predeterminada para las transacciones de consulta.
Esto se puede ver en el código fuente SimpleJParepository que SimpleJParepository define @Transactional (readOnly = true) a nivel de clase, mientras que la propiedad @Transactional se reescribe en operaciones relacionadas con Save and Delete. En este momento, la propiedad Readonly es falsa, y las otras operaciones de consulta Readonly siguen siendo falsas.
5. Soporte de transacciones de Spring Boot
1. Manager de transacciones configurado automáticamente
Cuando se usa JDBC como tecnología de acceso a datos, SpringBoot define el bean of PlatformTransactionManager para nosotros. Consulte la definición en org.springframework.boot.autoconfigure.jdbc.datasourcetransactionManagererAutoconfiguration Clase:
@Bean @ConditionAlonMissingBean @ConditionAlonBean (DataSource.class) PublicTransactionManager TransActionManager () {return New DataSourCetransactionManager (this.dataSource); }Cuando se usa JPA como tecnología de acceso a datos, Spring Boot define un Bean para la implementación de PlatformTransactionManager de JPatransactionManager; Vea la definición en org.springframework.boot.autoconfigure.orm.jpa.jpabaseconfiguration.class class:
@Bean @ConditionAlonMissingBean (PlatformTransactionManager.Class) PublicTransactionManager TransActionManager () {return New JPatransActionManager (); } 2. Habilite automáticamente el soporte para las transacciones de anotación
Spring Boot se usa especialmente para configurar transacciones como org.springframework.boot.autoconfigure.transaction.transactionAutoconfiguration. Esta clase de configuración depende de Jpabaseconfiguration y DataSourCetransactionManagerAutoconfiguration.
El soporte para las transacciones declarativas también está habilitado en la configuración de datos de DataSourCetransactionManagerAutoconfiguración, el código es el siguiente:
@Conditionalonmissingbean (abstractTransactionManagementConfiguration.class) @configuration @enabletransactionManagement de la clase estática protegida Configuración de gestión {}Entonces, en Spring Boot, no hay necesidad de mostrar la anotación @EnableTransactionManagement habilitada.
6. Ejemplo (springboot)
1.pom.xml:
<Spendency> <MoupRupid> org.springframework.boot </groupid> <artifactID> spring-boot-starter-web </artifactid> </pepertency> <papel> <MoupRupid> org.springFrameWork.Boot </groupId> <artifactid> Spring-boot-starter-data-JPA </artifactid> <//</groupId> <artifactid> <MoupRoD> org.springframework.boot </groupid> <artifactID> spring-boot-starter-data-rest-rest </artifactid> </pendency> <pendency> <proupid> mysql </groupId> <artifactID> mysql-connector-java </artifactid> <cope> runtime </cope> </cope> </dependency>
2.Application.yml:
Servidor: Puerto: 5000 Spring: DataSource: Driver-Class-Name: com.mysql.jdbc.driver url: jdbc: mysql: // localhost: 3306/test? useUnicode = true & caracteresCoding = utf8 & caracteresetResults = utf8 userneNeN: contraseña: contraseña: contraseña: contraseña jpa: hibernate: ddl-eutO: actualización # # Utfate # UTILIG show-sql: verdadero
3. Personal de clase de entidad:
@Entity Public Class Staff {@ID @GeneratedValue Private Long ID; nombre de cadena privada; edad de entero privado; dirección de cadena privada; Public Staff () {super (); } personal público (identificación larga, nombre de cadena, edad entero, dirección de cadena) {super (); this.id = id; this.name = name; this.age = edad; this.address = dirección; } // omitir los métodos Get and Set}4. Repositorio del personal:
El personal de la interfaz pública se extiende jParepository <Staff, Long> {}5. Interfaz de servicio:
Interfaz pública Servicio del personal {personal público SavESTAFFWitHrollback (personal del personal); // personal público de rollería SAVESTAFFWITHOUTROUTROLCK (personal del personal); // No se vuelva a revertir}6. Implementación del servicio:
@Service Public Class StaffServiceImpl implementa StaffService {@aUtowired StaftRepository StafPRepository; // Puede inyectar directamente el frijol de nuestro RersonRepository. @Override // Use el atributo Rollbackfor de la anotación @Transactional para especificar una excepción específica, los datos se retirarán. @TransActional (Rollbackfor = {ilegalArgumentException.class}) personal público Savestaffwithrollback (personal del personal) {Staff S = StaffRepository.Save (personal); if (staft.getName (). Equals ("Zhang San")) {tirar nueva IlegalArGumentException ("Zhang San ya existe, Rollback"); } return s; } @Override Public SAVESTAFFWITHOUTROLLACK (personal del personal) {Staff S = StaffRepository.Save (personal); if (staft.getName (). Equals ("Zhang San")) {tirar nueva ilegalArgumentException ("Zhang San ya existe, los datos no retroceden"); } return s; }}7. Controlador:
@RestController @RequestMapping ("/Staff") Public Class StaffController {@aUtowired StaffService StaffService; // Prueba la situación de reversión @RequestMapping ("/Rollback") Public Staff Rollback (personal del personal) {Return StaffService.Savestaffwithrollback (personal); } // Prueba la situación de reversión @RequestMapping ("/Notrollback") Public Staff Norollback (personal del personal) {Return StaffService.SavestaffwithoUtrollback (personal); }}8. Ejecute la prueba:
(1) Reversión: http: // localhost: 5000/staff/reversión? Nombre = Zhang San & Age = 18
Consola:
base de datos:
(2) Sin reversión: http: // localhost: 5000/staff/notrollback? Name = zhang san & edad = 18
Consola:
base de datos:
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.