<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="data.emf" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="data.emf" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager2" />
在我的服务层中,如果我有多个事务管理器,我可以使用@Transactional(name="transactionManager2");
来识别我使用的事务管理器吗?
答案 0 :(得分:21)
您可以使用value
attribute指定要与@Transactional
一起使用的tx管理器:
指定的限定符值 事务。
可用于确定目标 事务管理器,匹配 限定符值(或bean名称) 特定的PlatformTransactionManager bean定义。
例如:
@Transactional("txManager1");
或者,您可以使用更明确的TransactionProxyFactoryBean
,它可以让您更精细地控制哪些对象被tx管理器代理。这仍然使用注释,但它不会自动检测bean,它是在逐个bean的基础上显式配置的。
这通常不是问题,但除非您有充分的理由这样做,否则拥有多个交易管理器并不明智。如果你发现自己需要两个tx管理员,通常最好是看看你是否可以做一个。例如,如果您在应用服务器中配置了两个数据源,则可以将它们合并到一个JtaTransactionManager中,而不是两个单独的JpaTransactionManager
或DataSourceTransactionmanagers
。
答案 1 :(得分:2)
更多关于需要多个事务管理器的信息。您可能尝试按顺序执行嵌套或单独的事务 - 然后您可以使用不同的传播设置。您可以使用单个事务管理器配置Transaction propagation。
来实现