总结公司中的使用,沉淀中😎😎😎
首先我们项目中是将配置文件中的一个数据源对应一个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:
execute( TransactionCallbackWithoutResult action ): 这个方法与executeWithoutResult类似,但它接受一个TransactionCallbackWithoutResult接口的实现,该接口的doInTransaction方法不返回任何结果。execute( TransactionCallback<T> action ): 这个方法接受一个TransactionCallback<T>接口的实现,该接口的doInTransaction方法返回一个类型为T的结果。这个方法用于执行有返回值的事务性操作。execute( TransactionDefinition definition, TransactionCallback<T> action ): 这个方法允许你为事务指定一个自定义的TransactionDefinition,同时执行一个有返回值的事务性操作。这提供了更大的灵活性,允许你为特定操作设置不同的事务属性。execute( TransactionCallbackWithoutResult action, TransactionCallback<T> actionWithResult ): 这个方法同时接受两个TransactionCallback接口的实现。第一个action用于执行事务性操作,不返回结果;第二个actionWithResult在第一个操作成功完成后执行,用于执行额外的业务逻辑,并返回结果。如果第一个操作抛出异常,第二个操作将不会执行。