使用 2 个事务管理器@EnableTransactionManagement注释

2022-09-01 09:41:36

我正在使用注释来配置弹簧而不是xml文件。我正在配置2个具有不同会话工厂和不同事务管理器的数据源。我在这里遇到了一个问题来注释。我在其文档中读到,@Configuration@EnableTransactionManagement

@EnableTransactionManagement更灵活;它将回退到容器中任何 Bean 的按类型查找。因此,名称可以是“txManager”,“transactionManager”或“tm”:这根本不重要。PlatformTransactionManager

这意味着无论我给方法起什么名字,它都会总是搜索返回对象的方法,而我有2个事务管理器。现在的问题是,当我测试这个类时,它给我错误:PlatformTransactionManager

org.springframework.beans.factory.NoSuchBeanDefinitionException:未定义 [] 类型的唯一豆:预期的单个豆子,但发现 2org.springframework.transaction.PlatformTransactionManager

我甚至试图拥有2个不同的配置类,但徒劳无功。在 xml 配置中,情况并非如此。我用两个标签注册了我的两个事务管理器,它工作正常。但在这里不能用注释做同样的事情。<tx:annotation-driven transaction-manager="" />

如果我想在Spring注释配置类中配置2个数据源和2个不同的事务管理器,我该怎么办?


答案 1

在配置类中,使用注释。@EnableTransactionManagement

将此类中的事务管理器定义为:

    @Bean(name="txName")
    public HibernateTransactionManager txName() throws IOException{
        HibernateTransactionManager txName= new HibernateTransactionManager();
        txName.setSessionFactory(...);
        txName.setDataSource(...);
        return txName;
   }

在这里,在执行事务作业的类/方法中,按如下方式进行注释:

@Transactional("txName")

@Transactional(value = "txName")

这就是将名称合格的事务管理器绑定到您需要的任何位置的方法。现在,您可以根据需要拥有任意数量的事务管理器,并在任何需要的地方相应地使用它。


答案 2

为了以防万一有人遇到这个问题,我找到了一个解决方案:

@Configuration
@EnableTransactionManagement
@DependsOn("myTxManager")
@ImportResource("classpath:applicationContext.xml")
public class AppConfig implements TransactionManagementConfigurer {

@Autowired
private PlatformTransactionManager myTxManager;

...

@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
    return this.myTxManager;
}

通过这种方式,您可以使用在 xml 配置中定义的特定 txManager。

如果要定义在服务级别上使用的 txManager,则应从类中删除注释,并在注释中指定 txManager,例如@EnableTransactionManagement@Configuration@Transactional

@Service
@Transactional(value="myTxManager", readOnly = true)
public class MyServiceImpl implements MyService { ... }

推荐