Rumah  >  Artikel  >  Java  >  Apakah mekanisme pemprosesan transaksi SpringBoot?

Apakah mekanisme pemprosesan transaksi SpringBoot?

王林
王林ke hadapan
2023-05-18 23:04:041246semak imbas

1. Mekanisme transaksi Spring

Semua teknologi akses data mempunyai mekanisme pemprosesan transaksi ini menyediakan API untuk memulakan transaksi dan menyerahkan transaksi untuk menyelesaikan operasi data, atau Gulung semula data apabila ralat berlaku.

Mekanisme transaksi Spring menggunakan mekanisme bersatu untuk mengendalikan transaksi dengan teknologi akses data yang berbeza. Mekanisme transaksi Spring menyediakan antara muka PlatformTransactionManager dengan teknologi akses data yang berbeza menggunakan pelaksanaan antara muka yang berbeza:

Apakah mekanisme pemprosesan transaksi SpringBoot?

Kod untuk mentakrifkan pengurus transaksi dalam program adalah seperti berikut:

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

2. Transaksi pengisytiharan

Spring menyokong transaksi deklaratif, iaitu, menggunakan anotasi untuk memilih kaedah yang perlu menggunakan transaksi, ia menggunakan anotasi @Transactional untuk menunjukkan kaedah pada kaedah Kaedah memerlukan sokongan transaksi.

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

Apa yang memerlukan perhatian khusus di sini ialah anotasi @Transactional ini datang daripada pakej org.springframework.transaction.annotation, bukan javax.transaction.

Spring menyediakan anotasi @EnableTransactionManagement pada kelas konfigurasi untuk mendayakan sokongan transaksi deklaratif. Selepas menggunakan @EnableTransactionManagement, bekas Spring akan mengimbas kaedah dan kelas secara automatik yang dianotasi dengan @Transactional. Penggunaan @EnableTransactionManagement adalah seperti berikut:

@Configuration 
@EnableTransactionManagement 
public class AppConfig { 
 
}

3 Gunakan @Transactional di peringkat kelas

@Transactional boleh dianotasi bukan sahaja pada kaedah, tetapi juga pada kelas. . Apabila dianotasi pada kelas, ini bermakna semua kaedah awam kelas ini didayakan transaksi. Jika anotasi @Transactional digunakan pada kedua-dua peringkat kelas dan peringkat kaedah, anotasi yang digunakan pada peringkat kelas akan mengatasi anotasi peringkat kaedah.

4 Sokongan Transaksi Spring Data JPA

Spring Data JPA mendayakan sokongan transaksi untuk semua kaedah lalai dan transaksi kelas pertanyaan membolehkan readOnly secara lalai =true atribut.

Ini boleh dilihat daripada kod sumber SimpleJpaRepository mentakrifkan @Transactional (readOnly=true) pada peringkat kelas, dan atribut @Transactional ditulis semula dalam operasi yang berkaitan dengan menyimpan dan memadam Atribut readOnly adalah palsu, readOnly masih palsu untuk operasi pertanyaan yang lain.

5. Sokongan transaksi Spring Boot

1. Pengurus transaksi dikonfigurasikan secara automatik

Apabila menggunakan JDBC sebagai teknologi akses data Pada masa itu, SpringBoot mentakrifkan untuk kami Bean of PlatformTransactionManager yang melaksanakan DataSourceTransactionManager untuk konfigurasi, lihat takrifan dalam org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration kelas:

@Bean 
@ConditionalOnMissingBean 
@ConditionalOnBean(DataSource.class) 
public PlatformTransactionManager transactionManager() { 
 return new DataSourceTransactionManager(this.dataSource); 
}

Apabila menggunakan teknologi akses data, Spring sebagai JPA Boot mentakrifkan Bean untuk kami yang melaksanakan PlatformTransactionManager dan JpaTransactionManager untuk konfigurasi, lihat definisi dalam kelas org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.class:

@Bean 
@ConditionalOnMissingBean(PlatformTransactionManager.class) 
public PlatformTransactionManager transactionManager() { 
 return new JpaTransactionManager(); 
}

2. Dayakan transaksi anotasi secara automatik sokongan

Kelas Spring Boot yang khusus digunakan untuk mengkonfigurasi transaksi ialah: org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration ini bergantung pada JpaBaseConfiguration dan DataSourceTransactionManagerAutoConfiguration.

Dalam konfigurasi DataSourceTransactionManagerAutoConfiguration, sokongan untuk transaksi deklaratif juga didayakan:

@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class) 
@Configuration 
@EnableTransactionManagement 
protected static class TransactionManagementConfiguration { 
 
}

Jadi dalam Spring Boot, tidak perlu mendayakan secara eksplisit. anotasi @EnableTransactionManagement.

6. Contoh (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>

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

3. Kakitangan kelas entiti:

@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方法 
}

4 Repositori Staf:

public interface StaffRepository extends JpaRepository<staff> { 
 
}</staff>

5 Antara muka perkhidmatan:

public interface StaffService { 
 public Staff saveStaffWithRollBack(Staff staff);//回滚 
 public Staff saveStaffWithoutRollBack(Staff staff);//不回滚 
}

6 🎜>7.Pengawal:

@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; 
 } 
}

8 Ujian jalankan:

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

Apakah mekanisme pemprosesan transaksi SpringBoot?Konsol:

Apakah mekanisme pemprosesan transaksi SpringBoot?Pangkalan Data:

Apakah mekanisme pemprosesan transaksi SpringBoot? (2) Tiada rollback: http://localhost:5000/staff/notrollback?name=张三&age=18

Apakah mekanisme pemprosesan transaksi SpringBoot?Konsol:

Apakah mekanisme pemprosesan transaksi SpringBoot?Pangkalan Data:

Apakah mekanisme pemprosesan transaksi SpringBoot?

Atas ialah kandungan terperinci Apakah mekanisme pemprosesan transaksi SpringBoot?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam