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