如何在数据库事务提交成功后进行异步操作

需求:在事务成功后,执行另外一个异步操作

场景:在记录用户操作记录时,如果用户操作成功(提交事务后),则进行记录,如果操作失败,则不记录,且记录操作可能会涉及数据对比等耗时操作,要异步进行。

使用TransactionSynchronizationManager在事务提交之后操作

public void add(Book book){
    bookMapper.insert(book);
    // send after tx commit but is async
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
        @Override
        public void afterCommit() {
            System.out.println("add operation log after transaction commit...");
        }
    }
   );
}

该方法就可以实现在事务提交之后进行操作。

操作异步化

使用线程池来进行异步:

private final ExecutorService executorService = Executors.newFixedThreadPool(5);
public void insert(Book book){
    bookMapper.insert(book);
    //send after tx commit but is async
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
        @Override
        public void afterCommit() {
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("send email after transaction commit...");
                }
            });
        }
    }
    );
}

封装

内容来源

如何在数据库事务提交成功后进行异步操作

Transaction synchronization callbacks in Spring Framework

Last updated