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@Componentpublic class AfterTransactionComponent extends TransactionSynchronizationAdapter {@Overridepublic void afterCommit() {super.afterCommit();log.info("Transaction afterCommit...");}@Overridepublic void afterCompletion(int status) {super.afterCompletion(status);log.info("Transaction afterCompletion...");}}
1.2 引入事务组件
有股票信息保存服务 StockSaveService。
@Slf4j@Componentpublic class StockSaveService {@Resourceprivate StockMapper stockMapper;@Resourceprivate 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().
@Slf4jpublic class DistDataSourceTransactionManagerextends org.springframework.jdbc.datasource.DataSourceTransactionManager {private static final long serialVersionUID = -3474983022699527007L;public DistDataSourceTransactionManager() {}@Overrideprotected void doCommit(DefaultTransactionStatus status) {super.doCommit(status);log.info("DistDataSourceTransactionManager.doCommit success");}}
2.2 配置自定义事务管理器
使用 @Configuration 方式,实现 TransactionManagementConfigurer 来配置自定义的事务管理器。
@Configurationpublic class TransactionManagerConfig implements TransactionManagementConfigurer {@Resourceprivate DataSource dataSource;@Bean@Overridepublic PlatformTransactionManager annotationDrivenTransactionManager() {DistDataSourceTransactionManager transactionManager = new DistDataSourceTransactionManager();transactionManager.setDataSource(dataSource);return transactionManager;}}
配合 ThreadLocal 可以做消息发送、缓存处理等。
