我想知道是否可以在一种服务方法中使用两个事务管理器。 因为客户端的mysql数据库配置有限,我们在一个数据库中有两个不同的数据源,即每个模式一个用户/ pwd / url。这就是为什么我必须配置两个事务管理器。现在我遇到了服务实现的问题。请参阅以下代码:
public class DemoService{
...
@Transactional(value = "t1")
public doOne(){
doTwo();
}
@Transactional(value = "t2")
public doTwo(){
}
...
}
如果我使用这种代码模式,我总是得到异常
org.hibernate.HibernateException: No Session found for current thread
如果我单独运行这两种方法,它工作正常。 我错过了什么?或者还有其他工作吗? 任何建议将不胜感激。
btw:我的一些配置
<bean id="sessionFactorySso" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="mappingLocations">
<list>
<value>classpath*:sso.vo/*.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="generateDdl">true</prop>
<prop key="hibernate.dialect">${dialect} </prop>
</props>
</property>
<property name="dataSource" ref="dataSourceSso"/>
</bean>
<bean id="dataSourceSso" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${driver}"/>
<property name="jdbcUrl" value="${sso.url}"/>
<property name="user" value="${sso.username}"/>
<property name="password" value="${sso.password}"/>
<!-- these are C3P0 properties -->
<property name="acquireIncrement" value="2" />
<property name="minPoolSize" value="1" />
<property name="maxPoolSize" value="2" />
<property name="automaticTestTable" value="test_c3p0" />
<property name="idleConnectionTestPeriod" value="300" />
<property name="testConnectionOnCheckin" value="true" />
<property name="testConnectionOnCheckout" value="true" />
<property name="autoCommitOnClose" value="true" />
<property name="checkoutTimeout" value="1000" />
<property name="breakAfterAcquireFailure" value="false" />
<property name="maxIdleTime" value="0" />
</bean>
<bean id="transactionManagerSso" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactorySso"/>
<qualifier value="sso" />
</bean>
<tx:annotation-driven transaction-manager="transactionManagerSso" />
答案 0 :(得分:0)
因为您想在一个事务中登记两个数据源,所以您需要XA(全局)事务。
因此你需要:
答案 1 :(得分:0)
您有几个选择:
除了Vlad的解决方案(#4)之外,所有这些都有可能使数据库处于不一致状态。您需要使用JTA / XA /两阶段提交,以确保其中一个TX管理器在提交时抛出异常时保持一致性。