我们有一个用例,我们希望与支持事务的不同数据库进行通信,并希望通过spring提供的注释来实现。
我看到这个注释的工作方式是它使用客户端定义的DataSource bean选择PlatformTransactionManager
的默认实现,并与该持久层进行对话。
因此,要与其他数据源交谈,我必须提供TransactionManager
,在新数据源的帮助下覆盖其doBegin
方法。
但问题在于,如果我这样做,@Transaction
注释无法知道要选择哪个数据源(我无法看到bootstrap在这些情况下是如何工作的,因为我不知道看不出可能出现豆子冲突的方式 - 也许我在这里遗漏了一些东西。)
我能想到的一个替代方案是创建一个新的注释@DataSourceAwareTransaction,它接受默认数据源的参数,并在新注释中写入逻辑。
这种方法的问题是我必须更改所有现有代码,以便从@Transaction转移到@DataSourceAwareTransaction。
我所描述的方法看起来合理吗?有没有人有更好的想法?
谢谢!
答案 0 :(得分:1)
但问题在于,如果我这样做,
@Transaction
注释无法知道要选择哪个数据源....
当然有。看看@Transactional#transactionManager。相关章节指出:
transactionManager ( value 是别名)
可用于确定目标事务管理器,匹配a的限定符值(或bean名称)特定的PlatformTransactionManager bean定义。
您可以指定希望@Transactional
使用的事务管理器,并依次为特定数据源配置事务管理器。
示例:
@Transactional("yourTransactionManager")
或
@Transactional(value = "yourTxManager", isolation = ..., propagation = ...)
您的事务管理器bean定义如下所示:
@Bean
public PlatformTransactionManager yourTxManager() {
return new JpaTransactionManager(entityManagerFactory().getObject());
}
答案 1 :(得分:0)
请在这篇文章中看到答案我认为这正是您所寻找的,多个事务管理器使用限定符来告诉@Transactional使用哪个事务管理器。
Spring - Is it possible to use multiple transaction managers in the same application?