1。Springのトランザクションメカニズム
すべてのデータアクセステクノロジーには、トランザクション処理メカニズムがあり、APIがトランザクションを有効にしたり、トランザクションをコミットしてデータ操作を完了したり、エラーが発生したときにデータをロールバックしたりします。
Springのトランザクションメカニズムは、統一されたメカニズムを使用して、さまざまなデータアクセステクノロジーのトランザクションを処理します。 Springのトランザクションメカニズムは、PlatformTransactionManagerインターフェイスを提供し、さまざまなデータアクセステクノロジーのトランザクションが異なるインターフェイスを使用して実装されます。
プログラムでトランザクションマネージャーを定義するためのコードは次のとおりです。
@Bean Public PlatformTransactionManager TransactionManager(){jpatransactionManager transactionManager = new jpatransactionManager(); TransactionManager.setDataSource(dataSource()); Return TransactionManager; }2。宣言的なトランザクション
Springは、宣言トランザクション、つまり注釈を使用して、トランザクションを使用する必要がある方法を選択します。 @Transactional Annotationを使用して、メソッドがトランザクションサポートを必要とすることをメソッドに示します。
@transactional public void savesomething(long id、string name){//データベース操作}ここで、この@TransactionAl Annotationはorg.springframework.transaction.Annotationパッケージ、javax.transactionではないことに注意することが重要です。
Springは、@enabletransactionmanagement Annotationを提供して、構成クラスで宣言的なトランザクションサポートを有効にします。 @EnableTransActionManagementを使用した後、Springコンテナは、 @Transactionalの注釈付きメソッドとクラスを自動的にスキャンします。 @EnableTransActionManagementは次のように使用されます。
@configuration @enabletransactionmanagement public class appconfig {}3.クラスレベルで@Transactionalを使用します
@Transactionalは、メソッドだけでなく、クラスにも注釈を付けることができます。クラスで注釈を付けるとき、それはこのクラスのすべてのパブリック方法がトランザクション活性化であることを意味します。クラスレベルとメソッドレベルがクラスレベルで@Transactionalアノテーションを使用する場合、メソッドレベルの注釈はクラスレベルを使用して過負荷になります。
4。スプリングデータJPAのトランザクションサポート
Spring Data JPAは、すべてのデフォルトメソッドのトランザクションサポートを有効にし、QueryトランザクションではデフォルトでReadonly = Trueプロパティを有効にします。
これは、SimpleJparePositoryがクラスレベルで@Transactional(readonly = true)を定義するソースコードSimpleJparePositoryから見ることができますが、 @Transactionalプロパティは、保存と削除に関連する操作で書き換えられます。この時点で、Readonlyプロパティは虚偽であり、他のクエリ操作はまだ誤っています。
5。SpringBootのトランザクションサポート
1.自動的に構成されたトランザクションマネージャー
JDBCをデータアクセステクノロジーとして使用する場合、SpringbootはPlatformTransactionManagerのBeanを定義します。 org.springframework.boot.autoconfigure.jdbc.datasourcetransactionmanagerautoconfigurationクラスの定義を参照してください。
@bean @conditionalonmissingbean @conditionalonbean(datasource.class)public platformtransactionmanager transactionmanager(){return new datasourcetransactionmanager(this.datasource); }JPAをデータアクセステクノロジーとして使用する場合、Spring BootはJPATRANSACTIONMANAGERのPlatformTransactionManager実装の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 managementconfiguration {}したがって、Spring Bootでは、 @EnableTransactionManagement Annotationが有効になっていることを表示する必要はありません。
6。例(スプリングブート)
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-data-jpa-jpa-jpa-jpa-jpa-jpa-jpa-jpa-jpa-jpa-jpa-jpa-jpa-jpa-jpa-jpa-jpa </ <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-data-rest </artifactid> </dependency> <dependency> groupid> mysql> <artifactid> mysql-connector-java </artifactid> <scope> scope> scope> scope> scope> scope> scope> scope>
2.Application.yml:
サーバー:ポート:5000スプリング:DataSource:Driver-Class-Name:com.mysql.jdbc.Driver URL:jdbc:mysql:// localhost:3306/test?useunicode = true&charaterencoding = utf8&charputioneTresults = utf8 username:root crawnate:hidbernate:hidbernate:hidbernate:ddddl-ddl-ddl-ddl-ddl-auto show-sqlを更新:true
3。エンティティクラススタッフ:
@Entityパブリッククラススタッフ{@id @generatedValueプライベートロングID;プライベート文字列名;民間整数年齢;プライベート文字列アドレス。 public Staff(){super(); }公開スタッフ(長いID、文字列名、整数年齢、文字列アドレス){super(); this.id = id; this.name = name; this.age = age; this.address = address; } // get and setメソッドを省略}4。スタッフのリポジトリ:
Public Interface StaffRepositoryはjparePository <stuff、long> {}を拡張します5。サービスインターフェイス:
パブリックインターフェイスStaffService {Public Staff SavestaffWithRollback(スタッフスタッフ); // Rollingback Public Staff SavestaffWithoutrollback(スタッフスタッフ); //ロールバック}}6。サービスの実装:
@Service Public Class StaffServiceImpl StaffService {@Autowired StaffRepository StaffRepository; // rersonRepositoryの豆を直接注入できます。 @Override // @TransactionAl AnnotationのRollBackfor属性を使用して、特定の例外を指定すると、データがロールバックされます。 @transactional(rollbackfor = {Illegalargumentexception.class})パブリックスタッフSavestaffWithRollback(スタッフ){スタッフS = StaffRepository.Save(Staff); if(staff.getName()。equals( "Zhang San")){新しいIllegalargumentException( "Zhang Sanが既に存在し、ロールバック"); } return s; } @Override公開スタッフSavestaffWithoutrollback(スタッフ){スタッフs = StaffRepository.save(Staff); if(staff.getName()。equals( "Zhang San")){新しいIllegalargumentException( "Zhang Sanはすでに存在し、データはロールバックしない"); } return s; }}7.コントローラー:
@RestController @RequestMapping( "/stuff")Public Class StaffController {@Autowired StaffService StaffService; //ロールバックの状況をテスト@RequestMapping( "/lollback")パブリックスタッフロールバック(スタッフスタッフ){return staffservice.savestaffwithrollback(スタッフ); } //ロールバックの状況をテスト@RequestMapping( "/notrollback")パブリックスタッフノーオルバック(スタッフスタッフ){return Staffservice.savestaffwithoutrollback(stuff); }}8。テストを実行します:
(1)ロールバック:http:// localhost:5000/stuff/lollback?name = Zhang San&age = 18
コンソール:
データベース:
(2)ロールバックなし:http:// localhost:5000/stuff/notrollback?name = zhang san&age = 18
コンソール:
データベース:
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。