16
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

概要

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;
    });
}

16
19
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
16
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?