LoginSignup
15
14

More than 5 years have passed since last update.

トランザクションがコミットされたタイミングで任意の処理を実行させる方法 (Spring)

Last updated at Posted at 2015-10-22

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();
    }
}
15
14
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
15
14