Ref:
- https://blog.csdn.net/jaryle/article/details/109050458
- https://blog.csdn.net/qq_40977118/article/details/109014755
在数据库操作完成(事务提交完成)后进行一系列相关操作,如 redis 更新操作、发送消息到其他系统等操作。
1.基于事务机制 TransactionSynchronizationAdapter
1.1 自定义事务组件
继承 TransactionSynchronizationAdapter 自定义一个事务适配器。
@Slf4j
@Component
public class AfterTransactionComponent extends TransactionSynchronizationAdapter {
@Override
public void afterCommit() {
super.afterCommit();
log.info("Transaction afterCommit...");
}
@Override
public void afterCompletion(int status) {
super.afterCompletion(status);
log.info("Transaction afterCompletion...");
}
}
1.2 引入事务组件
有股票信息保存服务 StockSaveService。
@Slf4j
@Component
public class StockSaveService {
@Resource
private StockMapper stockMapper;
@Resource
private AfterTransactionComponent afterTransactionSendMsgComponent;
@Transactional(rollbackFor = Exception.class)
public Long createStock(String name, BigDecimal price) {
Stock stock = new Stock();
stock.setName(name);
stock.setPrice(price.longValue());
stock.setReleasedAt(new Date());
stockMapper.insert(stock);
log.info("StockSaveService.createStock OK stock:{}", JSON.toJSON(stock));
// 引入事务处理自定义组件(仅存在事务时引入)
if (TransactionSynchronizationManager.isActualTransactionActive()) {
// manager 的 synchronizations 容器是 set,可以注册多个适配器
TransactionSynchronizationManager.registerSynchronization(afterTransactionSendMsgComponent);
}
return stock.getId();
}
}
2.配置自定义事务管理器
2.1 自定义事务管理器
直接继承 Spring 默认的事务管理器,仅重写需要的 doCommit().
@Slf4j
public class DistDataSourceTransactionManager
extends org.springframework.jdbc.datasource.DataSourceTransactionManager {
private static final long serialVersionUID = -3474983022699527007L;
public DistDataSourceTransactionManager() {
}
@Override
protected void doCommit(DefaultTransactionStatus status) {
super.doCommit(status);
log.info("DistDataSourceTransactionManager.doCommit success");
}
}
2.2 配置自定义事务管理器
使用 @Configuration 方式,实现 TransactionManagementConfigurer 来配置自定义的事务管理器。
@Configuration
public class TransactionManagerConfig implements TransactionManagementConfigurer {
@Resource
private DataSource dataSource;
@Bean
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
DistDataSourceTransactionManager transactionManager = new DistDataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}
配合 ThreadLocal 可以做消息发送、缓存处理等。