spring
spring-boot
spring-data-jpa

Springで明示的トランザクション

More than 1 year has passed since last update.

概要

Springで明示的トランザクションを行う方法を調査した。

※ここでは宣言的トランザクション(@Transactional)については触れません。

目的

宣言的トランザクションでは満たせない要件があるときに使う?

やり方

TransactionManagerを使う

getTransactionからcommit / rollbackまでがトランザクションの範囲となる。

@Autowired
private PlatformTransactionManager transactionManager;

public void test() {
    TransactionDefinition def = new DefaultTransactionDefinition();
    TransactionStatus status = transactionManager.getTransaction(def);

    // DB操作
    ...

    if( <DB操作結果の判定> ) {
        // NGならロールバック
        transactionManager.rollback(status);
        return;
    }

    // OKならコミット
    transactionManager.commit(status);
}

TransactionTemplateを使う

TransactionTemplateのexecuteメソッドがトランザクションの範囲となる。

例外が発生すると自動でロールバックされ、そうでなければコミットされる。

明示的にロールバックしたいときは、setRollbackOnlyを呼び出す。

@Autowired
private TransactionTemplate transactionTemplate;

public void test() {
    Entity result = transactionTemplate.execute( status -> {
        // DB操作
        Entity result = select();

        // 明示的にロールバックしたいとき
        // status.setRollbackOnly();

        // 参照結果等があるときはreturnする
        return result;
    });
}