我在使用IBatis和TxScopeTransactionManager的代码库中使用Spring.NET声明式事务管理一段时间了。我刚刚添加了Spring.NET NHibernate对项目的支持(使用OSIV模式)没有问题。 NHibernate将仅用于新功能,ADO.NET / IBM遗留数据访问代码仍然需要按原样工作。所以我现在在我的上下文中有两个不同的事务管理器:
但是,看起来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写入数据库永远不会被刷新。
答案 0 :(得分:3)
根据the Java documentation,Spring的Java实现中的@Transaction
属性有一个附加参数,用于引用要使用的事务管理器。
这在今天的spring.net中不存在(我在版本1.3.2中没有找到它)但我发现DelegatingTransactionAttributeWithName
乍一看似乎有关但我不知道如何使用它
尽管如此,即使它不具备使用多个TransactionManagers的以下可能性:
[Transaction]
属性以模仿Java世界所具有的行为。如果你要去后面的路线,你需要:
<tx:attribute-driven transaction-manager="transactionManager"/>
即使我自己没有尝试过,这应该可行。 Java家伙were first再次从那里进化......