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() {
// 他にトランザクションが既に存在すると例外が発生
}
( ・。。・ )🖐
間違っている内容がありましたら、教えて頂ければ喜びます。