带有2个事务管理器的@EnableTransactionManagement注释

Mit*_*ani 27 java spring spring-annotations spring-3

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

@EnableTransactionManagement更灵活; 它将回退到PlatformTransactionManager容器中任何bean 的类型查找.因此,名称可以是"txManager","transactionManager"或"tm":它无关紧要.

这意味着我给方法的任何名称,它总是会搜索返回PlatformTransactionManager对象的方法,而我有2个transactionmanagers.现在问题是,当我测试这个类时,它给了我错误:

org.springframework.beans.factory.NoSuchBeanDefinitionException:没有org.springframework.transaction.PlatformTransactionManager定义类型为[ ]的唯一bean :期望的单个bean但找到2

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

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

Ang*_*gad 35

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

在此类中定义事务管理器:

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

在您的类/方法中执行事务作业,注释如下:

@Transactional("txName")
Run Code Online (Sandbox Code Playgroud)

要么

@Transactional(value = "txName")
Run Code Online (Sandbox Code Playgroud)

这就是如何将名称限定的事务管理器绑定到您需要的位置.您现在可以拥有任意数量的事务管理器,并根据需要随时使用它.


Sle*_*er9 8

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

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

@Autowired
private PlatformTransactionManager myTxManager;

...

@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
    return this.myTxManager;
}
Run Code Online (Sandbox Code Playgroud)

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

如果你要定义的txManager服务级别时,你就删除@EnableTransactionManagement从注释@Configuration类,并指定txManager@Transactional注解,如

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


gka*_*mal 5

来自java doc

对于那些希望在
@EnableTransactionManagement要使用的确切事务管理器bean 之间建立更直接关系的人, TransactionManagementConfigurer可以实现回调接口 - 注意下面的implements子句和@Override-annotated方法:

你的@Configuration类需要实现TransactionManagementConfigurer接口 - 实现annotationDrivenTransactionManager它将返回transactionManager应该使用的引用.

  • 您不能将两个事务管理器用于同一请求/事务.提供该设施用于两个不同的请求.如果您希望跨越多个请求的事务,则应使用单个JTATransactionManager.xml命名空间版本中也不支持您现在的要求(tx:annotation-driven) (2认同)