我们有一个用例,我们想要与支持事务的不同数据库进行通信,并希望通过 spring 提供的注释来完成此操作。
我认为此注释的工作方式是,它使用客户端定义的 DataSource bean 选择 PlatformTransactionManager
的默认实现,并与该持久层进行对话。
因此,要与另一个数据源通信,我必须提供一个 TransactionManager
,它在新数据源的帮助下重写其 doBegin
方法。
但这里的问题是,如果我这样做,@Transaction 注释就无法知道要选择哪个数据源(我无法看到 Bootstrap 在这些数据源中如何工作)因为我没有看到可能出现 Bean 冲突的情况 - 也许我在这里遗漏了一些东西)。
我能想到的一种替代方法是创建一个新的注释@DataSourceAwareTransaction,它接受默认数据源的参数,并将逻辑写入新的注释中。
这种方法的问题是我必须更改所有现有代码以从 @Transaction 移动到 @DataSourceAwareTransaction。
我描述的方法看起来足够合理吗?有人有更好的想法吗?
谢谢!
最佳答案
But the problem here is that if I do that, there is no way for the
@Transaction
annotation to know about which data source to pick....
当然有。看看@Transactional#transactionManager 。相关部分指出:
transactionManager (value is an alias)
May be used to determine the target transaction manager, matching the qualifier value (or the bean name) of a specific PlatformTransactionManager bean definition.
您可以指定希望@Transactional
使用的事务管理器,然后事务管理器会针对特定数据源进行配置。
示例:
@Transactional("yourTransactionManager")
或
@Transactional(value = "yourTxManager", isolation = ..., propagation = ...)
事务管理器 bean 定义如下所示:
@Bean
public PlatformTransactionManager yourTxManager() {
return new JpaTransactionManager(entityManagerFactory().getObject());
}
关于java - 不同数据源的@Transaction注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45499588/