当前位置: 首页 > 面试题库 >

是否可以在同一应用程序中使用多个事务管理器?

吕自明
2023-03-14
问题内容

我是Spring的新手,我想知道是否可以在同一应用程序中使用多个事务管理器?

我有两个数据访问层-一个用于两个数据库。我想知道,你如何在一个层使用一个事务管理器,而在另一层使用另一个事务管理器。我不需要在两个数据库之间都执行事务。但是我确实需要分别在每个数据库上执行事务。我创建了一个图像来帮助概述我的问题:

这是我的应用程序上下文配置:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <context:component-scan base-package="cheetah.repositories" />
    <tx:annotation-driven />

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="accounts" />
    </bean>

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <bean id="transactionManager"
        class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

</beans>

这是使用此配置的示例:

@Repository
public class JpaAccountRepository implements AccountRepository {

    @PersistenceContext(unitName = "cheetahAccounts")
    private EntityManager accountManager;

    @Override
    @Transactional
    public Account findById(long id) {

        Account account = accountManager.find(Account.class, id);
        return account;
    }
}

因此,对于帐户存储库,我想使用将持久性单元设置为帐户的实体管理器工厂。但是,对于我的BusinessData存储库,我想使用具有不同持久性单元的实体管理器工厂。由于只能定义一个事务管理器bean,因此如何针对不同的存储库使用不同的事务管理器?


问题答案:

在使用@Transactional注释的地方,可以通过将属性集添加到Bean名称或限定符来指定要使用的事务管理器。例如,如果你的应用程序上下文使用限定符定义了多个事务管理器:

<bean id="transactionManager1"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory1" />
    <qualifier value="account"/>
</bean>

<bean id="transactionManager2"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory2" />
    <qualifier value="businessData"/>
</bean>

你可以使用限定符指定要使用的事务管理器:

public class TransactionalService {

    @Transactional("account")
    public void setSomethingInAccount() { ... }

    @Transactional("businessData")
    public void doSomethingInBusinessData() { ... }
}


 类似资料:
  • 我在dockerized应用程序和Memcached上遇到了一个问题,要存储一些值,显然,当a启动一个运行Spymemcached客户端的新Docker实例时,所有存储在缓存中的数据都是无效的,所以如果我之前在节点1的缓存中存储了一些值,然后启动节点2,这些值将从Memcached服务器中清除,最后如果a在节点1上再次存储相同的值,并在节点2上查询,它们将共享到两个节点之外,而不清除数据。是预期的

  • 我正在构建一个spring boot应用程序,它有多个数据源、实体管理器、事务管理器和数据库。每一个都是为一个客户提供的,并共享相同的DAO、服务。 数据源之间的切换工作得很好。但我对交易有问题 这里是我的配置: } 根据配置文件加载数据源。像LoadCust4DatasourceCondition之类的类用于检查是否加载。 我的数据源配置文件是: 我的服务就像: 我的刀是这样的: 在服务级别,如

  • 问题内容: 好的,因此我们正在尝试将3D散点图合并到NetBeans 7.0中的项目中,而我们选择测试的库之一就是Jzy3D。看起来它可以完成我们需要做的所有事情,但是不幸的是,它什么也没做。 我已经正确安装了JOGL,并对其进行了测试并发现它可以正常工作。然后,我包含了与演示中相同的依赖项。我也尝试过直接包括.jars。是的,胶原- rt.jar在库文件夹中。 编辑: 为了使JOGL工作,我们不

  • 我尝试在一个应用程序中运行Eureka服务器和Spring Boot Admin服务器(SBA Docu说这是可能的)。尤里卡正按预期工作,但管理应用程序仍显示零应用程序。 Spring Boot Version 2.0.3,Spring Boot Admin Version 2.0.1 Eureka和SBA服务器 客户端应用程序。yml

  • 我正在使用spring boot 2.5.1和Java 11。 我试图在同一个应用程序中创建SpringBoot管理服务器和客户端,但是当我启动它时,控制台中出现以下错误。 裁判:https://github.com/codecentric/spring-boot-admin 错误 未能将应用程序注册为Spring-boot-admin([http://localhost:8085/instanc

  • 我在spring应用程序中使用jdbctemplate对db执行查询。 下面是用@Transactional注释的方法 我的问题是,如果1和2成功而3失败,那么1和2上的事务是否会回滚?我怎么测试这个?