Java @事务性saveAll不适用于第二数据源Spring JPA中的表
我有两个数据源,ds1,ds2。在一个@Transactional的服务中,我必须从两个表中获取值并更新它们 示例代码段Java @事务性saveAll不适用于第二数据源Spring JPA中的表,java,hibernate,spring-data-jpa,spring-data,Java,Hibernate,Spring Data Jpa,Spring Data,我有两个数据源,ds1,ds2。在一个@Transactional的服务中,我必须从两个表中获取值并更新它们 示例代码段 @Service public class MyService { @Autowired ds1Repository ds1Repository; // from data source 1 (DB Name - DB1) MYSQL @Autowired ds2Repository ds2Repository; // from
@Service
public class MyService {
@Autowired
ds1Repository ds1Repository; // from data source 1 (DB Name - DB1) MYSQL
@Autowired
ds2Repository ds2Repository; // from data source 2 (DB Name - DB2) MYSQL
@Transactional (javax.Transactional)
public void processUpdates() {
// Able to get the result set from both the data sources
List<Data1> ds1Data = ds1Repository.findAll();
List<Data2> ds2Data = ds1Repository.findAll();
// modified the collections ds1Data & ds2Data
// This is getting updated
ds1Repository.saveAll(ds1Data);
// This update is not heppening and no exception thrown
ds2Repository.saveAll(ds2Data);
}
}
@服务
公共类MyService{
@自动连线
ds1Repository ds1Repository;//来自数据源1(DB Name-DB1)MYSQL
@自动连线
ds2Repository ds2Repository;//来自数据源2(DB Name-DB2)MYSQL
@事务性(javax.Transactional)
public void processUpdates(){
//能够从两个数据源获取结果集
List ds1Data=ds1Repository.findAll();
List ds2Data=ds1Repository.findAll();
//修改了集合ds1Data和ds2Data
//这是得到更新
ds1Repository.saveAll(ds1Data);
//此更新未打开且未引发异常
ds2Repository.saveAll(ds2Data);
}
}
我尝试了以下WY:
- 您有2个数据源,这意味着您将有2个 TransactionManager bean
- 现在,当您使用@Transactional而不指定名称时,它将 使用默认TransactionManager
- 这意味着,只有默认事务提交一次 processUpdate()完成
- 我不知道您是否需要分布式事务管理,如果没有,那么就使用带有适当TransactionManager名称的独立@Transactional on saveAll()
import org.springframework.transaction.annotation.Transactional;
@Transactional(transactionManager = ChainedTransactionManagerConfig.TRANSACTION_MANAGER)
另外,请使用Spring中的事务性注释(org.springframework.transaction.Annotation)您可以将您的尝试粘贴到
ChainedTransactionManager
?公共类多数据源transactionManager{@Bean(name=“ChainedTransactionManager”)公共ChainedTransactionManager transactionManager(@Qualifier(“transactionManager”)PlatformTransactionManager ds1,@Qualifier(“tm2”)PlatformTransactionManager ds2{返回新的ChainedTransactionManager(ds1,ds2);}}
import org.springframework.transaction.annotation.Transactional;
@Transactional(transactionManager = ChainedTransactionManagerConfig.TRANSACTION_MANAGER)