Ref:

在数据库操作完成(事务提交完成)后进行一系列相关操作,如 redis 更新操作、发送消息到其他系统等操作。

1.基于事务机制 TransactionSynchronizationAdapter

缺点:对其他业务代码有侵入

1.1 自定义事务组件

继承 TransactionSynchronizationAdapter 自定义一个事务适配器。

  1. @Slf4j
  2. @Component
  3. public class AfterTransactionComponent extends TransactionSynchronizationAdapter {
  4. @Override
  5. public void afterCommit() {
  6. super.afterCommit();
  7. log.info("Transaction afterCommit...");
  8. }
  9. @Override
  10. public void afterCompletion(int status) {
  11. super.afterCompletion(status);
  12. log.info("Transaction afterCompletion...");
  13. }
  14. }

1.2 引入事务组件

有股票信息保存服务 StockSaveService。

  1. @Slf4j
  2. @Component
  3. public class StockSaveService {
  4. @Resource
  5. private StockMapper stockMapper;
  6. @Resource
  7. private AfterTransactionComponent afterTransactionSendMsgComponent;
  8. @Transactional(rollbackFor = Exception.class)
  9. public Long createStock(String name, BigDecimal price) {
  10. Stock stock = new Stock();
  11. stock.setName(name);
  12. stock.setPrice(price.longValue());
  13. stock.setReleasedAt(new Date());
  14. stockMapper.insert(stock);
  15. log.info("StockSaveService.createStock OK stock:{}", JSON.toJSON(stock));
  16. // 引入事务处理自定义组件(仅存在事务时引入)
  17. if (TransactionSynchronizationManager.isActualTransactionActive()) {
  18. // manager 的 synchronizations 容器是 set,可以注册多个适配器
  19. TransactionSynchronizationManager.registerSynchronization(afterTransactionSendMsgComponent);
  20. }
  21. return stock.getId();
  22. }
  23. }

2.配置自定义事务管理器

2.1 自定义事务管理器

直接继承 Spring 默认的事务管理器,仅重写需要的 doCommit().

  1. @Slf4j
  2. public class DistDataSourceTransactionManager
  3. extends org.springframework.jdbc.datasource.DataSourceTransactionManager {
  4. private static final long serialVersionUID = -3474983022699527007L;
  5. public DistDataSourceTransactionManager() {
  6. }
  7. @Override
  8. protected void doCommit(DefaultTransactionStatus status) {
  9. super.doCommit(status);
  10. log.info("DistDataSourceTransactionManager.doCommit success");
  11. }
  12. }

2.2 配置自定义事务管理器

使用 @Configuration 方式,实现 TransactionManagementConfigurer 来配置自定义的事务管理器。

  1. @Configuration
  2. public class TransactionManagerConfig implements TransactionManagementConfigurer {
  3. @Resource
  4. private DataSource dataSource;
  5. @Bean
  6. @Override
  7. public PlatformTransactionManager annotationDrivenTransactionManager() {
  8. DistDataSourceTransactionManager transactionManager = new DistDataSourceTransactionManager();
  9. transactionManager.setDataSource(dataSource);
  10. return transactionManager;
  11. }
  12. }

配合 ThreadLocal 可以做消息发送、缓存处理等。