java - 不同数据源的@Transaction注解

标签 java spring transactions annotations

我们有一个用例,我们想要与支持事务的不同数据库进行通信,并希望通过 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/

相关文章:

python - Django 1.6 事务以避免竞争条件

php - 数据库插入随机未使用的行 - 带事务

java - 如何修复身份始终返回 0 的 HSQL DataSource + TxM

java - 使用 Android NDK 将 C++ 对象传递给 Java 的最有效方法是什么

java - 使用DataInputStream接收文件信息并写入

spring - 不要在某些网址上使用 session

java - 尝试在 websphere 8.5.5.13 上部署 ear 时出现 AnnotationException?

java - NoClassDefFoundError : javax. xml.bind.DatatypeConverter

java - java中堆栈跟踪中的行号

java - 我正在运行一个 jar 文件,它显示以下错误