LoginSignup
3
1

More than 3 years have passed since last update.

【SpringBatch】Tasklet内部でトランザクション管理

Last updated at Posted at 2020-11-07

概要

SpringBatchでTaskletを使ってトランザクション処理を書いていたのですが、
「あれ、commitされない…」という事象に当たったので解決方法を残しておきます

利用ライブラリ

  • org.springframework.boot:spring-boot-starter-batch:2.3.5.RELEASE
  • org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3

問題のコード

サンプルですが、@Transactionalを使ってトランザクション管理をしようとしています

Sample.java
@Transactional(rollbackFor = Throwable.class)
public class Sample {
    // トランザクション処理を行うメソッド
    public doTransaction {
        // DBへのinsert, update, deleteなど
    }
}

期待としてはdoTransactionメソッド実行後にcommitが実行される
と思っていたのですが、実行されない…

解決方法

@Transactionalpropagation = Propagation.REQUIRES_NEWを設定すればOK!

@Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRES_NEW)

デフォルトではPropagation.REQUIREDが設定されているのですが、
これは

  • トランザクションがすでに存在すれば、そのトランザクションを利用
    • 親のトランザクションが終了しないとcommitされない
  • トランザクションが存在しなければ、新規に作成

という動作になる設定のようです。
(推測ですが)SpringBatchで生成した親トランザクションがいたので、そのトランザクションに吸収されていたようです。

Propagation.REQUIRES_NEWを指定すると、既存のトランザクションの有無によらず、
新しいトランザクションが生成されるようになります😊

3
1
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
3
1