【发布时间】:2012-01-31 15:26:08
【问题描述】:
一段时间以来,我一直在将 IBatis 与 TxScopeTransactionManager 结合使用的代码库中使用 Spring.NET 声明式事务管理。我刚刚向项目添加了 Spring.NET NHibernate 支持(使用 OSIV 模式),没有问题。 NHibernate 将仅用于新功能,ADO.NET/IBatis 遗留数据访问代码仍需要按原样工作。所以我现在在我的上下文中有两个不同的事务管理器:
- Spring.Data.Core.TxScopeTransactionManager(现有 Tran Mgr)
- Spring.Data.NHibernate.HibernateTransactionManager(为 Nhibernate 添加)
但是,看起来 Spring.NET 只允许将单个 TransactionManager 绑定到 Transaction 属性,因为使用此属性修饰的旧服务方法现在使用 HibernateTransactionManager 而不是 TxScopeTransactionManager 来提交或回滚事务。这是有问题的,因为 HibernateTransactionManager 不知道任何非 nHibernate(读取 ADO.NET)连接。
有没有办法让 [Transaction] 使用不同的事务管理器,可能与 ObjectNameAutoProxyCreator 一起根据命名空间包含/排除服务类?
如果没有,有没有办法让一个事务管理器同时处理 NHibernate 和 IBatis 事务?
我使用 HibernateTransactionManager 对此进行了测试,以管理这两种数据访问策略,但我的 IBatis 事务没有回滚。这特别奇怪,因为我可以在 SQL Profiler 中看到 Begin Tran 和 Rollback Tran 都由 HibernateTransactionManager 发送,但数据仍然被提交。
如果我使用 TxScopeTransactionManager,那么我的 IBatis 事务会成功回滚,但 NHibernate 对数据库的写入永远不会刷新。
【问题讨论】:
标签: .net transactions aop spring.net