Heim > Java > javaLernprogramm > Was ist der SpringBoot-Transaktionsverarbeitungsmechanismus?

Was ist der SpringBoot-Transaktionsverarbeitungsmechanismus?

王林
Freigeben: 2023-05-18 23:04:04
nach vorne
1283 Leute haben es durchsucht

1. Der Transaktionsmechanismus von Spring

Diese Technologien bieten APIs zum Öffnen von Transaktionen und zum Vervollständigen von Datenvorgängen Rollback der Daten, wenn ein Fehler auftritt.

Der Transaktionsmechanismus von Spring verwendet einen einheitlichen Mechanismus zur Abwicklung von Transaktionen mit unterschiedlichen Datenzugriffstechnologien. Der Transaktionsmechanismus von Spring bietet eine PlatformTransactionManager-Schnittstelle. Transaktionen mit unterschiedlichen Datenzugriffstechnologien verwenden unterschiedliche Schnittstellenimplementierungen:

Was ist der SpringBoot-Transaktionsverarbeitungsmechanismus?

Definieren Sie den Transaktionsmanager im Programm. Der Code lautet wie folgt folgt:

@Bean 
public PlatformTransactionManager transactionManager() { 
 JpaTransactionManager transactionManager = new JpaTransactionManager(); 
 transactionManager.setDataSource(dataSource()); 
 return transactionManager; 
}
Nach dem Login kopieren

2. Deklarative Transaktionen

Spring unterstützt deklarative Transaktionen, dh die Verwendung von Anmerkungen zur Auswahl der Methoden, die Transaktionen verwenden müssen , die die @Transactional-Annotation für die Methode verwendet, um anzugeben, dass die Methode Transaktionsunterstützung erfordert.

@Transactional 
public void saveSomething(Long id, String name) { 
 //数据库操作 
}
Nach dem Login kopieren

Was hier besondere Aufmerksamkeit erfordert, ist, dass diese @Transactional-Annotation aus dem Paket org.springframework.transaction.annotation stammt, nicht aus javax.transaction.

Spring stellt eine @EnableTransactionManagement-Annotation für die Konfigurationsklasse bereit, um deklarative Transaktionsunterstützung zu ermöglichen. Nach der Verwendung von @EnableTransactionManagement scannt der Spring-Container automatisch Methoden und Klassen, die mit @Transactional annotiert sind. Die Verwendung von @EnableTransactionManagement ist wie folgt:

@Configuration 
@EnableTransactionManagement 
public class AppConfig { 
 
}
Nach dem Login kopieren

3. Verwenden Sie @Transactional

@Transactional kann nicht nur auf Methoden annotiert werden, sondern auch auch Anmerkung zur Klasse. Wenn eine Klasse mit Anmerkungen versehen ist, bedeutet dies, dass alle öffentlichen Methoden dieser Klasse transaktionsfähig sind. Wenn die Annotation @Transactional sowohl auf Klassenebene als auch auf Methodenebene verwendet wird, überschreibt die auf Klassenebene verwendete Annotation die Annotation auf Methodenebene.

4. Transaktionsunterstützung von Spring Data JPA

Die Transaktionsunterstützung von Spring Data JPA ist für alle Standardmethoden aktiviert. Und die readOnly Das Attribut =true ist standardmäßig für Abfragetransaktionen aktiviert.

Dies ist aus dem Quellcode SimpleJpaRepository ersichtlich, der @Transactional (readOnly=true) auf Klassenebene definiert und das @Transactional-Attribut in Vorgängen im Zusammenhang mit Speichern und Löschen neu schreibt , das Attribut readOnly ist falsch und readOnly ist für die restlichen Abfragevorgänge immer noch falsch. 5. Transaktionsunterstützung von Spring Boot JDBC als Datenzugriffstechnologie, SpringBoot definiert für uns die Bean von PlatformTransactionManager, die DataSourceTransactionManager implementiert; für die Konfiguration siehe die Definition in der Klasse org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration:

@Bean 
@ConditionalOnMissingBean 
@ConditionalOnBean(DataSource.class) 
public PlatformTransactionManager transactionManager() { 
 return new DataSourceTransactionManager(this.dataSource); 
}
Nach dem Login kopieren
Wann Unter Verwendung von JPA als Datenzugriffstechnologie definiert Spring Boot eine Bean, die JpaTransactionManager von PlatformTransactionManager für uns implementiert. Weitere Informationen finden Sie in der Definition in der Klasse org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.class:

@Bean 
@ConditionalOnMissingBean(PlatformTransactionManager.class) 
public PlatformTransactionManager transactionManager() { 
 return new JpaTransactionManager(); 
}
Nach dem Login kopieren
2. Unterstützung für Anmerkungstransaktionen automatisch aktivieren

Die speziell zum Konfigurieren von Transaktionen verwendete Klasse ist: org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, diese Konfigurationsklasse hängt davon ab auf JpaBaseConfiguration und DataSourceTransactionManagerAutoConfiguration.

In der DataSourceTransactionManagerAutoConfiguration-Konfiguration ist auch die Unterstützung für deklarative Transaktionen aktiviert. Der Code lautet wie folgt:

@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class) 
@Configuration 
@EnableTransactionManagement 
protected static class TransactionManagementConfiguration { 
 
}
Nach dem Login kopieren

Also in Spring Boot, nein Sie müssen die Anzeige aktivieren und die Annotation @EnableTransactionManagement verwenden.

6. Beispiel (Springboot)


1.pom.xml:

<dependency> 
 <groupid>org.springframework.boot</groupid> 
 <artifactid>spring-boot-starter-web</artifactid> 
</dependency> 
<dependency> 
 <groupid>org.springframework.boot</groupid> 
 <artifactid>spring-boot-starter-data-jpa</artifactid> 
</dependency> 
<dependency> 
 <groupid>org.springframework.boot</groupid> 
 <artifactid>spring-boot-starter-data-rest</artifactid> 
</dependency> 
<dependency> 
 <groupid>mysql</groupid> 
 <artifactid>mysql-connector-java</artifactid> 
 <scope>runtime</scope> 
</dependency>
Nach dem Login kopieren

2 .application.yml:

server: 
 port: 5000 
 
spring: 
 datasource: 
 driver-class-name: com.mysql.jdbc.Driver 
 url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8 
 username: root 
 password: password 
 
 jpa: 
 hibernate: 
 ddl-auto: update # 第一次简表create 后面用update 
 show-sql: true
Nach dem Login kopieren

3. Entitätsklasse-Mitarbeiter:

@Entity 
public class Staff { 
 @Id 
 @GeneratedValue 
 private Long id; 
 private String name; 
 private Integer age; 
 private String address; 
 
 public Staff() { 
 super(); 
 } 
 
 public Staff(Long id, String name, Integer age, String address) { 
 super(); 
 this.id = id; 
 this.name = name; 
 this.age = age; 
 this.address = address; 
 } 
 //省略get、set方法 
}
Nach dem Login kopieren
4. Mitarbeiter-Repository:

public interface StaffRepository extends JpaRepository<staff> { 
 
}</staff>
Nach dem Login kopieren
5. Service-Schnittstelle: # 🎜 🎜#
public interface StaffService { 
 public Staff saveStaffWithRollBack(Staff staff);//回滚 
 public Staff saveStaffWithoutRollBack(Staff staff);//不回滚 
}
Nach dem Login kopieren

6. Service-Implementierung:

@Service 
public class StaffServiceImpl implements StaffService { 
 
 @Autowired 
 StaffRepository staffRepository; //可以直接注入我们的RersonRepository的Bean。 
 
 @Override 
 //使用@Transactional注解的rollbackFor属性,指定特定异常时,数据回滚。 
 @Transactional(rollbackFor = {IllegalArgumentException.class}) 
 public Staff saveStaffWithRollBack(Staff staff) { 
 Staff s = staffRepository.save(staff); 
 if (staff.getName().equals("张三")) { 
  throw new IllegalArgumentException("张三已经存在了,rollback"); 
 } 
 return s; 
 } 
 
 @Override 
 public Staff saveStaffWithoutRollBack(Staff staff) { 
 Staff s = staffRepository.save(staff); 
 if (staff.getName().equals("张三")) { 
  throw new IllegalArgumentException("张三已经存在了,数据不回滚"); 
 } 
 return s; 
 } 
}
Nach dem Login kopieren

7.Controller:

@RestController 
@RequestMapping("/staff") 
public class StaffController { 
 @Autowired 
 StaffService staffService; 
 
 //测试回滚情况 
 @RequestMapping("/rollback") 
 public Staff rollback(Staff staff) { 
 return staffService.saveStaffWithRollBack(staff); 
 } 
 
 //测试不回滚情况 
 @RequestMapping("/notrollback") 
 public Staff noRollBack(Staff staff) { 
 return staffService.saveStaffWithoutRollBack(staff); 
 } 
}
Nach dem Login kopieren

8. Test ausführen:

(1) Rollback: http://localhost:5000/staff/rollback?name=张三&age=18

Konsole:

#🎜🎜 #

Datenbank:

Was ist der SpringBoot-Transaktionsverarbeitungsmechanismus?

(2) Kein Rollback: http://localhost :5000/staff /notrollback?name=张三&age=18

Was ist der SpringBoot-Transaktionsverarbeitungsmechanismus?

Konsole:

# 🎜🎜##🎜 🎜#Datenbank: Was ist der SpringBoot-Transaktionsverarbeitungsmechanismus?

Das obige ist der detaillierte Inhalt vonWas ist der SpringBoot-Transaktionsverarbeitungsmechanismus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage