Я уже некоторое время без проблем использую декларативные транзакции Spring.NET в веб-приложении.Рекомендации по транзакциям применяются исключительно к методам уровня обслуживания.
Недавно мы развернули две службы WCF, которые используют наши объекты управляемой службы Spring в качестве зависимостей.Мы используем Spring.ServiceModel.Activation.ServiceHostFactory
для создания экземпляров этих сервисов в соответствии с примерами Spring.NET.
Вскоре после развертывания этих сервисов на производстве мы столкнулись с периодическими ошибками класса AdoPlatformTransactionManager
, который управляет транзакциями Spring.
Текст ошибки:
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Transaction'.
at System.Transactions.Transaction.get_IsolationLevel()
at System.Transactions.TransactionScope..ctor(TransactionScopeOption scopeOption, TransactionOptions
at AdoPlatformTransactionManager.DoBegin(Object transaction, ITransactionDefinition definition)
at Spring.Transaction.Support.AbstractPlatformTransactionManager.GetTransaction(ITransactionDefinition definition)
Эти ошибки периодически и кажутся коррелированными с текущей загрузкой сервера (чем больше пользователей, тем выше вероятность воспроизведения).Кроме того, мы не видели таких исключений ни в одном из наших вызовов методов службы, не инициированных WCF.Пока у меня есть две очень шаткие теории:
- Создание экземпляров / область объектов WCF (PerCall) не очень хорошо работает с объектами-сервисами-одиночками
- Некоторая проблема параллелизмав котором несколько экземпляров службы WCF могут вмешиваться в окружающие транзакции других не связанных между собой экземпляров (потоковое локальное хранилище?)
Поиск этой ошибки и поиск по наиболее заброшенным форумам поддержки Spring.NET ничего не дали,так что любая помощь или идеи приветствуются!
Обновление 1
Сделали немного больше отладки и получили больше ясности в этом вопросе.Похоже, что настоящая проблема связана не с транзакциями, а с восстановлением каналов WCF из неисправного состояния.
Каждый раз, когда возникает необработанное исключение во время вызова метода WCF (в моем случае это было нарушение FK), канал, кажется, остается в постоянно сбойном состоянии.
Что еще хуже, когда канал переходит в неисправное состояние, это влияет на всех пользователей этой службы, поскольку Spring.NET не создает новый канал для каждого пользователя.Похоже, что единственный способ решить эту проблему - перезапустить пул приложений.
На основании ссылок, указанных ниже, я не уверен, что проблема в Spring.NET, сбой WCF в целом или что-то ещеполностью.
Ссылки
Время ожидания клиента при использовании wcf-through-spring-net
Лучший-Practices-and-Recover-a-Failed-Channel
что такое лучший обходной путь для wcf-клиента, использующего проблему блока