Java中编程性事务的使用经验

190 阅读2分钟

总结公司中的使用,沉淀中😎😎😎

首先我们项目中是将配置文件中的一个数据源对应一个TransactionTemplate

依次创建businessCompleteDataSource数据源Bean、businessCompleteTransactionManager事务管理器Bean、事务执行器businessCompleteTransactionTemplate的bean

 @Bean("businessCompleteDataSource")
 @ConfigurationProperties(prefix = "spring.datasource.complete")
 public DataSource completeDataSource() {
     return DataSourceBuilder.create().type(HikariDataSource.class).build();
 }
 ​
 @Bean("businessCompleteTransactionManager")
 public DataSourceTransactionManager defaultTransactionManager(@Qualifier("businessCompleteDataSource") DataSource datasource){
 ​
     return new DataSourceTransactionManager(datasource);
 }
 @Bean("businessCompleteTransactionTemplate")
 public TransactionTemplate transactionTemplate(@Qualifier("businessCompleteTransactionManager") DataSourceTransactionManager sourceTransactionManager){
     return new TransactionTemplate(sourceTransactionManager);
 }

第一种使用:

 // 执行添加浏览记录
 try {
     TransactionStatus transaction = dataSourceTransactionManager.getTransaction(transactionDefinition);
     vipUserDeduct(userId, dto.getOpportunityId(), dto.getAppId(), dto.getProjectType(), proceed,
                dto.getSolrInfoDto(), detailsAnnotation.wxApplet(), dto.getUnlockChannel(), customMonitoringAuth());
     dataSourceTransactionManager.commit(transaction);
 } catch (Exception e) {
     log.error("执行添加浏览记录处理异常", e);
     dataSourceTransactionManager.rollback(transaction);
     throw e;
 }

当你调用dataSourceTransactionManager.getTransaction(transactionDefinition)时,如果当前没有活动的事务,Spring将根据TransactionDefinition中定义的属性(如传播行为)创建一个新的事务。如果已经存在一个事务,Spring将根据TransactionDefinition中的设置将当前操作加入到这个现有事务中。

第二种使用:

 transactionTemplate.executeWithoutResult(e -> {
     for (Map.Entry<Integer, List<BusinessConfigQuotaDto>> entry : appQuotaMap.entrySet()) {
         Integer key = entry.getKey();
         List<BusinessConfigQuotaDto> value = entry.getValue();
         QuotaManageStrategy instance = BusinessQuotaStrategyFactory.getInstance(key);
         instance.configQuota(value);
     }
 });

除了这个还有一下api:

  1. execute( TransactionCallbackWithoutResult action ) : 这个方法与executeWithoutResult类似,但它接受一个TransactionCallbackWithoutResult接口的实现,该接口的doInTransaction方法不返回任何结果。
  2. execute( TransactionCallback<T> action ) : 这个方法接受一个TransactionCallback<T>接口的实现,该接口的doInTransaction方法返回一个类型为T的结果。这个方法用于执行有返回值的事务性操作。
  3. execute( TransactionDefinition definition, TransactionCallback<T> action ) : 这个方法允许你为事务指定一个自定义的TransactionDefinition,同时执行一个有返回值的事务性操作。这提供了更大的灵活性,允许你为特定操作设置不同的事务属性。
  4. execute( TransactionCallbackWithoutResult action, TransactionCallback<T> actionWithResult ) : 这个方法同时接受两个TransactionCallback接口的实现。第一个action用于执行事务性操作,不返回结果;第二个actionWithResult在第一个操作成功完成后执行,用于执行额外的业务逻辑,并返回结果。如果第一个操作抛出异常,第二个操作将不会执行。