Spring Boot の @Transactional アノテーションとは何ですか、その原理、および使用方法

Spring Boot の @Transactional アノテーションとは何ですか、その原理、および使用方法

序章

Spring Boot では、@Transactional アノテーションはデータベース トランザクションを管理するための非常に重要なアノテーションです。@Transactional アノテーションを使用すると、トランザクションを簡単に制御してデータの一貫性と整合性を確保できます。この記事では、@Transactionalアノテーションの役割や原理、使い方を紹介します。

ここに画像の説明を挿入

@Transactional アノテーションの役割

@Transaction アノテーションは、Spring Boot でトランザクションを宣言するために使用されるアノテーションの 1 つです。@Transactional アノテーションを使用する場合は、トランザクション管理が必要なメソッドまたはクラスにアノテーションを付ける必要があります。これにより、これらのメソッドまたはクラスにトランザクション管理が必要であることが Spring Boot に通知されます。@Transactional アノテーションを使用する場合、トランザクションの分離レベル、トランザクションの伝播動作などのいくつかの属性も指定できます。

Spring Boot における @Transactional アノテーションの機能は、アノテーションが付けられたメソッドまたはクラスを Spring Boot のトランザクション管理のスコープに取り込み、トランザクション管理を実現することです。メソッドまたはクラスが呼び出されると、Spring Boot は自動的にトランザクションを開始し、メソッドまたはクラスの実行が完了した後、実行結果に応じてトランザクションをコミットする必要があるかロールバックする必要があるかを判断します。

@Transactional アノテーションの原理

Spring Boot では、@Transactional アノテーションは AOP (アスペクト指向プログラミング) メカニズムを通じて実装されます。具体的には、@Transactional アノテーションは Spring Boot のトランザクション インターセプターを通じて実装されます。アノテーションが付けられたメソッドまたはクラスが呼び出されると、Spring Boot のトランザクション インターセプターがメソッドまたはクラスをインターセプトし、アノテーションで指定された属性に従ってトランザクションを開始します。

トランザクションを開始するとき、Spring Boot はまず現在のスレッドにトランザクションがすでに存在するかどうかを確認します。トランザクションがすでに存在する場合、アノテーションで指定された伝播動作に従って、新しいトランザクションを作成する必要があるかどうかが決定されます。トランザクションが存在しない場合は、新しいトランザクションが作成されます。

トランザクションの実行中に例外が発生した場合、Spring Boot はトランザクションの設定に従ってトランザクションをロールバックするかどうかを決定します。トランザクションが正常に実行されると、Spring Boot はトランザクション設定に従ってトランザクションをコミットするかどうかを決定します。

@Transactionalアノテーションの使い方

Spring Boot では、@Transactional アノテーションの使用は非常に簡単です。トランザクション管理が必要なメソッドまたはクラスに @Transactional アノテーションを付与するだけで、そのメソッドまたはクラスをトランザクション管理の範囲に含めることができます。@Transactional アノテーションを使用した例を次に示します。

@Service
public class UserService {
    
    
    
    @Autowired
    private UserRepository userRepository;
    
    @Transactional
    public void saveUser(User user) {
    
    
        userRepository.save(user);
    }
    
}

上記の例では、saveUser() メソッドに @Transactional アノテーションが付けられているため、トランザクション管理の対象となります。

@Transactional アノテーションのデフォルトの伝播動作は REQUIRED であることに注意してください。つまり、トランザクションが現在のスレッドにすでに存在する場合、メソッドは実行のために現在のトランザクションに追加され、それ以外の場合は新しいトランザクションが作成されます。伝播動作を変更する必要がある場合は、伝播プロパティを使用して指定できます。

@Transactional アノテーションは、伝播動作に加えて、分離レベル、読み取り専用トランザクションなどの他の属性もサポートします。属性を含む @Transactional アノテーションの例を次に示します。

@Service
public class UserService {
    
    
    
    @Autowired
    private UserRepository userRepository;
    
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, readOnly = true)
    public User getUserById(Long userId) {
    
    
        return userRepository.findById(userId).orElse(null);
    }
    
}

上記の例では、 getUserById() メソッドは @Transactional アノテーションでマークされ、伝播動作、分離レベル、および読み取り専用トランザクション属性を指定します。

メソッドに対して @Transactional アノテーションを使用するだけでなく、クラスに対して @Transactional アノテーションを使用して、トランザクション管理の範囲内のクラス内のすべてのメソッドを含めることもできます。以下に例を示します。

@Service
@Transactional
public class UserService {
    
    
    
    @Autowired
    private UserRepository userRepository;
    
    public void saveUser(User user) {
    
    
        userRepository.save(user);
    }
    
    public User getUserById(Long userId) {
    
    
        return userRepository.findById(userId).orElse(null);
    }
    
}

上記の例では、UserService クラスに @Transactional アノテーションが付けられているため、このクラスのすべてのメソッドがトランザクション管理の範囲に含まれます。

要約する

@Transaction アノテーションは、Spring Boot でデータベース トランザクションを管理するための非常に重要なアノテーションです。@Transactional アノテーションを使用すると、トランザクションを簡単に制御してデータの一貫性と整合性を確保できます。この記事では、@Transactionalアノテーションの役割や原理、使い方について紹介しました。実際の開発では、 @Transactional アノテーションを合理的に使用すると、コードの保守性と可読性が向上し、システムのパフォーマンスと安定性も向上します。

おすすめ

転載: blog.csdn.net/it_xushixiong/article/details/131435387