Атрибут Spring.NET [Transaction] поддерживает несколько менеджеров транзакций? - PullRequest
1 голос
/ 31 января 2012

Я уже некоторое время использую декларативное управление транзакциями Spring.NET в кодовой базе, которая использует IBatis вместе с TxScopeTransactionManager.Я просто добавил в проект поддержку Spring.NET NHibernate (используя шаблон OSIV) без проблем.NHibernate будет использоваться только для новых функций, устаревший код доступа к данным ADO.NET/IBatis по-прежнему должен работать как есть.Итак, у меня теперь есть два разных менеджера транзакций в моем контексте:

  1. Spring.Data.Core.TxScopeTransactionManager (существующий Tran Mgr)
  2. 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 в БД никогда не сбрасываются.

1 Ответ

3 голосов
/ 03 февраля 2012

Согласно документации Java атрибут @Transaction в реализации Java Spring имеет дополнительный параметр, который используется для ссылки на используемый диспетчер транзакций.Этого не существует в spring.net сегодня (я не нашел его в версии 1.3.2), но я нашел DelegatingTransactionAttributeWithName, который на первый взгляд кажется связанным, но я не знаюкак его использовать.

Тем не менее, даже если у вас нет следующих возможностей использовать несколько TransactionManager:

  • Реализуйте свой собственный "DelegatingTransactionManager", производный от AbstractPlatformTransactionManager и расширение атрибута [Transaction] для имитации поведения, которое уже имеет мир Java.
  • Используйте декларативную аннотацию транзакции вместо основанных на коде атрибутов и определите отдельные транзакцииManager.

Если вы собираетесь пойти по более позднему маршруту, вам нужно:

Даже если я сам не пробовал, это должно работать.Снова парни Java были первыми и развивались оттуда ...

...