Я уже некоторое время использую декларативное управление транзакциями Spring.NET в кодовой базе, которая использует IBatis вместе с TxScopeTransactionManager.Я просто добавил в проект поддержку 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 (read ADO.NET).
Есть ли способ заставить [Transaction] использовать разные менеджеры транзакций, возможно, в сочетании с ObjectNameAutoProxyCreator, чтобы либо включить/ исключить классы обслуживания, основанные на пространстве имен?
Если нет, есть ли способ, чтобы одна транзакцияManager обрабатывала транзакции NHibernate и IBatis?
Я протестировал это с помощью HibernateTransactionManager для управления обеими стратегиями доступа к данным, но мои транзакции IBatis не откатывались.Это особенно странно, потому что я вижу в SQL Profiler, что HibernateTransactionManager отправляет и Begin Tran и Rollback Tran , но данные по-прежнему фиксируются.
Если я использую TxScopeTransactionManager, то мой откат транзакций IBatis успешно выполняется, но записи NHibernate в БД никогда не сбрасываются.