TransactionSynchronizationManager を使うと、トランザクションがコミットされる(された)時に実行される処理を登録できます。
また、トランザクションに紐付けるリソースを保持させておくことも可能。
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
foo();
}
}
);
} else {
foo();
}
トランザクション内かどうかを isSynchronizationActive
で確認してから、トランザクション内だった場合は registerSynchronization
を使用して処理を登録します。
DB は使わなくて、アプリケーションコンテナのトランザクション管理も無いけど、@Transactional
で処理を区切って、TransactionSynchronizationManager を使用したいという人は、なにも管理しない TransactionManager をつくると良いです。以下みたいな感じです。
NullTransactionManager.java
public class NullTransactionManager extends AbstractPlatformTransactionManager {
@Override
protected Object doGetTransaction() {
Thread current = Thread.currentThread();
return current.getName() + '-' + current.getId();
}
@Override
protected void doBegin(Object transaction, TransactionDefinition definition) {
// N/A
}
@Override
protected void doCommit(DefaultTransactionStatus status) {
// N/A
}
@Override
protected void doRollback(DefaultTransactionStatus status) {
// N/A
}
}
TransactionConfiguration.java
@Configuration
@EnableTransactionManagement
public class TransactionConfiguration {
@Bean
public PlatformTransactionManager platformTransactionManager() {
return new NullTransactionManager();
}
}