使用Spring和Hibernate对两个数据库实例使用声明式事务管理

时间:2011-12-14 14:25:23

标签: nhibernate transactions sqlite spring.net declarative

我正在寻找一个解决方案,使用Spring(V1.3.2)和NHibernate(V3.2.0)以及Spring的声明式事务管理来与两个独立的SQLite数据库实例进行通信。

目前我可以从两个数据库实例读取和写入,但事务管理仅适用于一个数据库(DbProvider_DB1)。

“为什么”对我来说很清楚,但我如何对两个数据库使用声明式事务管理?我需要两个交易经理吗?如果是,我如何定义第二个并使用它?

这是我的配置,没有什么奇怪的,但为了完整起见:


dao.xml

<tx:attribute-driven />

<!-- Datenbankprovider -->
<db:provider id="DbProvider_DB1" provider="SQLite-1.0.72" connectionString="Data Source=db1.db3;Version=3;New=False;" />
<db:provider id="DbProvider_DB2" provider="SQLite-1.0.72" connectionString="Data Source=db2.db3;Version=3;New=False;" />

<!-- SessionFactories -->
<object id="SessionFactory" abstract="true" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate32">
  <property name="HibernateProperties">
    <dictionary>...</dictionary>
  </property>
  <property name="ExposeTransactionAwareSessionFactory" value="true" />
</object>

<object id="SessionFactory_DB1" parent="SessionFactory" >
  <property name="DbProvider" ref="DbProvider_DB1" />
</object>

<object id="SessionFactory_DB2" parent="SessionFactory" >
  <property name="DbProvider" ref="DbProvider_DB2" />
</object>

<!-- Transactionmanager -->  
<object id="transactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate32">
  <property name="DbProvider" ref="DbProvider_DB1"/>
  <property name="SessionFactory" ref="SessionFactory_DB1"/>
  <property name="TransactionSynchronization" value="Always"/>
</object>

<!-- Data Access Objects -->
<object id="Dao_DB1" type="Dao1, Dao">
  <property name="SessionFactory" ref="SessionFactory_DB1" />
</object>

<object id="Dao_DB2" type="Dao2, Dao">
  <property name="SessionFactory" ref="SessionFactory_DB2" />
</object>

[Transaction]
public TEntity Save( TEntity entity )
{
  CurrentSession.Save( entity );
  return entity;
}

感谢名单

1 个答案:

答案 0 :(得分:1)

解决方案是使用Scope TransactionManager而不是HibernateTransactionManager。

<object id="transactionManager" type="Spring.Data.Core.TxScopeTransactionManager, Spring.Data">
    <property name="TransactionSynchronization" value="Always"/>
</object>