@Transaction注释使用不同的数据源

时间:2017-08-04 06:24:56

标签: java spring transactions annotations

我们有一个用例,我们希望与支持事务的不同数据库进行通信,并希望通过spring提供的注释来实现。

我看到这个注释的工作方式是它使用客户端定义的DataSource bean选择PlatformTransactionManager的默认实现,并与该持久层进行对话。

因此,要与其他数据源交谈,我必须提供TransactionManager,在新数据源的帮助下覆盖其doBegin方法。

但问题在于,如果我这样做,@Transaction注释无法知道要选择哪个数据源(我无法看到bootstrap在这些情况下是如何工作的,因为我不知道看不出可能出现豆子冲突的方式 - 也许我在这里遗漏了一些东西。)

我能想到的一个替代方案是创建一个新的注释@DataSourceAwareTransaction,它接受默认数据源的参数,并在新注释中写入逻辑。

这种方法的问题是我必须更改所有现有代码,以便从@Transaction转移到@DataSourceAwareTransaction。

我所描述的方法看起来合理吗?有没有人有更好的想法?

谢谢!

2 个答案:

答案 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?