記事のディレクトリ
1.トランザクション管理の概要
すべてのデータアクセステクノロジーはトランザクション処理から切り離せません。そうしないと、データの不整合が発生します。現在のエンタープライズレベルのアプリケーション開発では、トランザクション管理が不可欠です。データベーストランザクションとは、完全に実行されるか、まったく実行されないかのいずれかで、単一の論理的な作業単位として実行される一連の操作を指します。トランザクション処理により、トランザクションユニット内のすべての操作が正常に完了しない限り、データ指向のリソースが永続的に更新されないことが保証されます。
関連する一連の操作を、すべて成功またはすべて失敗するユニットに結合することで、エラーリカバリを簡素化し、アプリケーションの信頼性を高めることができます。論理作業単位がトランザクションになるには、いわゆるACID(原子性、一貫性、分離、および耐久性)属性を満たす必要があります。トランザクションは、データベース操作の論理作業単位であり、トランザクション管理サブシステムはデータベースはトランザクション処理を担当します。
最初に明確にする必要があるのは、Spring Bootトランザクションメカニズムは本質的にSpringのトランザクションメカニズムであり、統一されたメカニズムを使用してさまざまなデータアクセステクノロジーからのトランザクションを処理しますが、SpringBootは自動構成機能に基づいて部分処理を実行して開発者を節約します構成は機能します。
Springトランザクション管理は2つの方法に分けられます。
- プログラマティックトランザクションとは、コーディングによるトランザクションの実装を指します。
- AOPに基づく宣言型トランザクションは、特定のビジネスロジックをトランザクション処理から切り離します。これが推奨される方法です。
2、宣言的な事柄
宣言型トランザクションはAOPメカニズムに基づいて構築されており、その本質は、メソッドの前後でインターセプトし、ターゲットメソッドが開始する前にトランザクションを作成または追加し、その後のターゲットメソッドの実行に応じてトランザクションを送信またはロールバックすることです。ターゲットメソッドが実行されます。宣言型トランザクションの最大の利点は、特定のビジネスロジックとトランザクション処理がAOPメカニズムによって分離され、プログラミングによってトランザクションを管理する必要がないため、トランザクション管理コードをビジネスロジックコードにドープする必要がないことです。したがって、実際の使用では、宣言型トランザクションがより多く使用されます。
宣言型トランザクションには2つの方法があります。1つはXML構成ファイルで関連するトランザクションルール宣言を行う方法、もう1つは@Transactionalアノテーションに基づく方法です(@Transactionalアノテーションはorg.springframework.transaction.annotationパッケージからのものです)。トランザクションルールをビジネスロジックに適用できます。
SpringBootでは、アノテーション@Transactionalを使用してトランザクションを制御することをお勧めします。トランザクション管理が必要なメソッドまたはクラスに@Transactionalアノテーションを追加するだけで済みます。次に、コードで説明します。
まず、ビジネスコードパッケージとして新しいサービスパッケージを作成します。トランザクション処理は通常、サービスレイヤーで行われます。もちろん、コントローラーレイヤーでも処理できますが、ビジネスレイヤーで処理することをお勧めします。パッケージに新しいTransactionTestServiceクラスを作成します。
package com.wang.service;
import com.wang.dao.AuthorDao;
import com.wang.entity.Author;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
@Service
public class TransactionTestService {
@Resource
AuthorDao authorDao;
public Boolean test1() {
Author author = new Author();
author.setPassword("test1-password");
author.setName("test1_name");
author.setId("test1_id");
// 在数据库表中新增一条记录
authorDao.addAuthor(author);
// 发生异常
System.out.println(1/0);
return true;
}
@Transactional
public Boolean test2() {
Author author = new Author();
author.setPassword("test2-password");
author.setName("test2_name");
author.setId("test2_id");
// 在数据库表中新增一条记录
authorDao.addAuthor(author);
// 发生异常
System.out.println(1/0);
return true;
}
}
まず、@ Serviceをクラスに追加して管理用のIOCコンテナーに登録し、次にUserDaoオブジェクトを挿入して後続のデータレイヤー操作を実装し、最後に2つのビジネスメソッドtest1()とtest2()を実装します。2つの実装は似ています。ただし、2つのメソッドによって追加されたユーザーオブジェクト名とパスワード文字列が異なり、@ Transactionalアノテーションがtest2()メソッドに追加され、test1()メソッドは追加されません。このメソッドでは、次のコードを追加しました。番号0から番号1を削除します。このコードには例外が必要です。これを使用して、例外が発生したときにトランザクションが成功するかどうかをシミュレートします。
通常の理解によれば、SQLステートメントの実行後に例外が発生すると、データベースの変更はトランザクションによってロールバックされます。通常、test1()メソッドはないため、データベースにはtest1データはありますが、test2データはありません。含まれるトランザクション管理では、@ Transactionalアノテーションにより、test2()メソッドはトランザクションマネージャーによって処理されます。
興味のある人は、効果をテストするために独自のコードを書くことができます。
さらに、@ Transactionalは、メソッドだけでなくクラスにもアノテーションを付けることができます。クラスに注釈が付けられている場合、このクラスのすべてのパブリックメソッドがオープントランザクションであることを意味します。@Transactionalアノテーションがクラスレベルとメソッドレベルの両方で使用されている場合、クラスレベルで使用されているアノテーションはメソッドレベルのアノテーションをオーバーライドします。