1. Spring のトランザクション メカニズム
すべてのデータ アクセス テクノロジにはトランザクション処理メカニズムがあり、これらのテクノロジは、トランザクションを開始してトランザクションを送信してデータ操作を完了したり、データをロールバックしたりするための API を提供します。エラーが発生します。
Spring のトランザクション メカニズムは、統合されたメカニズムを使用して、さまざまなデータ アクセス テクノロジーによるトランザクションを処理します。 Spring のトランザクション メカニズムは、PlatformTransactionManager インターフェイスを提供します。さまざまなデータ アクセス テクノロジーを使用したトランザクションは、さまざまなインターフェイスを使用して実装されます:
プログラムでトランザクション マネージャーを定義するコードは次のとおりです:
@Bean public PlatformTransactionManager transactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setDataSource(dataSource()); return transactionManager; }
2. 宣言型トランザクション
Spring は宣言型トランザクションをサポートしています。つまり、アノテーションを使用してトランザクションを使用する必要があるメソッドを選択し、@Transactional アノテーションを使用してそれを示します。メソッド上のメソッド メソッドにはトランザクションのサポートが必要です。
@Transactional public void saveSomething(Long id, String name) { //数据库操作 }
ここで特別な注意が必要なのは、この @Transactional アノテーションが javax.transaction ではなく org.springframework.transaction.annotation パッケージから取得されているということです。
Spring は、宣言型トランザクションのサポートを有効にするために、構成クラスに @EnableTransactionManagement アノテーションを提供します。 @EnableTransactionManagement を使用すると、Spring コンテナは @Transactional アノテーションが付けられたメソッドとクラスを自動的にスキャンします。 @EnableTransactionManagement の使用法は次のとおりです:
@Configuration @EnableTransactionManagement public class AppConfig { }
3. クラス レベルで @Transactional を使用します
@Transactional はメソッドだけでなくクラスにもアノテーションを付けることができます。クラスにアノテーションが付けられている場合、このクラスのすべてのパブリック メソッドがトランザクション対応であることを意味します。 @Transactional アノテーションがクラス レベルとメソッド レベルの両方で使用されている場合、クラス レベルで使用されるアノテーションがメソッド レベルのアノテーションをオーバーライドします。
4. Spring Data JPA のトランザクション サポート
Spring Data JPA では、すべてのデフォルト メソッドのトランザクション サポートが有効になり、クエリ タイプのトランザクションはデフォルトで readOnly を有効にします =真の属性。
SimpleJpaRepository のソースコードを見るとわかるように、SimpleJpaRepository ではクラスレベルで @Transactional (readOnly=true) が定義されており、保存や削除に関する操作で @Transactional 属性が書き換えられます。 readOnly 属性は false で、残りのクエリ操作では readOnly は false のままです。
5. Spring Boot のトランザクションサポート
1. 自動的に設定されるトランザクションマネージャー
データアクセス技術として JDBC を使用する場合, SpringBoot は、DataSourceTransactionManager を実装する PlatformTransactionManager の Bean を定義しました。設定については、org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration クラスの定義を参照してください:
@Bean @ConditionalOnMissingBean @ConditionalOnBean(DataSource.class) public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(this.dataSource); }
JPA をデータ アクセス テクノロジとして使用する場合、 Spring Boot は、PlatformTransactionManager と JpaTransactionManager を実装する Bean を定義します。構成については、org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.class クラスの定義を参照してください:
@Bean @ConditionalOnMissingBean(PlatformTransactionManager.class) public PlatformTransactionManager transactionManager() { return new JpaTransactionManager(); }
2。トランザクションのサポート
トランザクションの構成に特に使用される Spring Boot のクラスは: org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration この構成クラスは JpaBaseConfiguration と DataSourceTransactionManagerAutoConfiguration に依存します。
DataSourceTransactionManagerAutoConfiguration 構成では、宣言型トランザクションのサポートも有効になっています。コードは次のとおりです:
@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class) @Configuration @EnableTransactionManagement protected static class TransactionManagementConfiguration { }
したがって、Spring Boot では、明示的に有効にする必要はありません@EnableTransactionManagement アノテーション。
6. 例 (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. エンティティ クラス スタッフ:
@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. スタッフのリポジトリ:
public interface StaffRepository extends JpaRepository<staff> { }</staff>
5. サービス インターフェイス:
public interface StaffService { public Staff saveStaffWithRollBack(Staff staff);//回滚 public Staff saveStaffWithoutRollBack(Staff staff);//不回滚 }
6. サービス実装:
@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; } }
7.コントローラー:
@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); } }
8. テストの実行:
(1) ロールバック: http://localhost:5000/staff/rollback?name=张三&age=18
コンソール:
データベース:
(2)ロールバックなし: http://localhost:5000/staff/notrollback?name=张三&age=18
コンソール:
データベース:
以上がSpringBootのトランザクション処理機構とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。