如何在数据库事务提交成功后进行异步操作
需求:在事务成功后,执行另外一个异步操作
场景:在记录用户操作记录时,如果用户操作成功(提交事务后),则进行记录,如果操作失败,则不记录,且记录操作可能会涉及数据对比等耗时操作,要异步进行。
使用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...");
}
});
}
}
);
}