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:
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
Konsol:
Pangkalan Data:
(2) Tiada rollback: http://localhost:5000/staff/notrollback?name=张三&age=18
Konsol:
Pangkalan Data:
Atas ialah kandungan terperinci Apakah mekanisme pemprosesan transaksi SpringBoot?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!