0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

springとmybatisでトランザクションを使う。

Posted at

springでトランザクション管理方法

① Programmatic方式
PlatformTransactionManagerを使い、手動でトランザクションを開始・コミット・ロールバック。
② Declarative方式(宣言的)
Transactionalアノテーションを使い、Springフレームワークが自動的にトランザクション管理を行ってくれる。

programmatic vs declarative

一般的には宣言的な方法が簡単で便利。特別な制御が必要な場合にはプログラマティックな方法を使う。
1メソッド1坊式で使える。混ぜて使えない。

① Programmatic方式の例

import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

public class MyService {
    @AutoWired
    PlatformTransactionManager transactionManager;

    public void 単純なビジネスロジックメソッド() {
        // トランザクション定義の設定
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);  // トランザクションの伝播設定

        // トランザクションを開始
        TransactionStatus status = transactionManager.getTransaction(def);

        try {
            // ビジネスロジックの実行
            someRepository.save(entity);//mybatis Repository
            anotherRepository.update(entity);//mybatis Repository

            // トランザクションをコミット
            transactionManager.commit(status);
        } catch (Exception ex) {
            // 例外発生時にはロールバック
            transactionManager.rollback(status);
            throw ex;
        }
    }
}

PlatformTransactionManagerのトランザクション定義とトランザクションの伝播設定?

DefaultTransactionDefinition

トランザクション管理の中で、トランザクションの動作を設定するためのインターフェース。
トランザクション定義の主な設定項目は伝播(Propagation)、タイムアウト、分離レベルなどがある。

TransactionStatus

PlatformTransactionManagerのgetTransaction()メソッドを呼び出してトランザクションを開始する。この時、TransactionStatus オブジェクトが返却され、トランザクションの状態や管理情報を保持できる。

Propagation

伝播とは、メソッドが呼び出されたときにそのメソッドがすでにトランザクション内で実行されているかを基準でそのメソッドのトランザクションの動作を決定すること。

伝播の主な種類
・PROPAGATION_REQUIRED: 既存のトランザクションがあればそれを使用し、なければ新しいトランザクションを開始。
・PROPAGATION_NEVER: そのメソッドが実行されるときに、もしすでにトランザクションが存在していたら、IllegalTransactionStateException がスローされる。

上記二つ以外にもたくさん。

② Declarative方式の例

import org.springframework.transaction.annotation.Transactional;

public class MyService {

    @Transactional
    public void 単純なビジネスロジックメソッド() {
        someRepository.save(entity);//mybatis Repository
        anotherRepository.update(entity);//mybatis Repository
    }
}

Transactionalのトランザクション定義とトランザクションの伝播設定?

Transactionalアノテーションのパラメーターに書く。こんな感じ。

@Transactional(propagation = Propagation.NEVER)
public void someMethod() {
    // 他にトランザクションが既に存在すると例外が発生
}

( ・。。・ )🖐

間違っている内容がありましたら、教えて頂ければ喜びます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?