Spring.NET [Transaction]属性是否支持多个事务管理器?

时间:2012-01-31 15:26:08

标签: .net transactions aop spring.net

我在使用IBatis和TxScopeTransactionManager的代码库中使用Spring.NET声明式事务管理一段时间了。我刚刚添加了Spring.NET NHibernate对项目的支持(使用OSIV模式)没有问题。 NHibernate将仅用于新功能,ADO.NET / IBM遗留数据访问代码仍然需要按原样工作。所以我现在在我的上下文中有两个不同的事务管理器:

  1. Spring.Data.Core.TxScopeTransactionManager(现有的Tran Mgr)
  2. Spring.Data.NHibernate.HibernateTransactionManager(为Nhibernate添加)
  3. 但是,看起来Spring.NET只允许将单个TransactionManager绑定到Transaction属性,因为使用此属性修饰的旧服务方法现在使用HibernateTransactionManager而不是TxScopeTransactionManager来提交或回滚事务。这是有问题的,因为HibernateTransactionManager不知道任何非nHibernate(读取ADO.NET)连接。

    有没有办法让[Transaction]使用不同的Transaction Manager,可能与ObjectNameAutoProxyCreator一致,根据命名空间包含/排除服务类?

    如果没有,有没有办法让一个transactionManager同时处理NHibernate和IBatis事​​务?

    我使用HibernateTransactionManager对此进行了测试,以管理两种数据访问策略,但我的IBatis事​​务没有得到回滚。这特别奇怪,因为我可以在SQL事件探查器中看到HibernateTransactionManager正在发送 Begin Tran Rollback Tran ,但数据仍然会被提交。

    如果我使用TxScopeTransactionManager,那么我的IBatis事​​务成功回滚,但NHibernate写入数据库永远不会被刷新。

1 个答案:

答案 0 :(得分:3)

根据the Java documentation,Spring的Java实现中的@Transaction属性有一个附加参数,用于引用要使用的事务管理器。 这在今天的spring.net中不存在(我在版本1.3.2中没有找到它)但我发现DelegatingTransactionAttributeWithName乍一看似乎有关但我不知道如何使用它

尽管如此,即使它不具备使用多个TransactionManagers的以下可能性:

  • 通过派生AbstractPlatformTransactionManager实现您自己的“DelegatingTransactionManager”并扩展[Transaction]属性以模仿Java世界所具有的行为。
  • 使用声明式事务注释而不是基于代码的属性,并定义单独的transactionManagers。

如果你要去后面的路线,你需要:

即使我自己没有尝试过,这应该可行。 Java家伙were first再次从那里进化......