Просто любопытный, если кто-либо еще имеет эту конкретную ошибку и знает, как решить ее?
Сценарий следующие...
У нас есть Библиотека Предприятия использования веб-приложения ASP.NET, работающая на Windows Server 2008 ферма IIS, соединяющаяся с SQL Server кластерный бэкэнд 2008 года. MSDTC включен. Соединения с БД объединены.
Мое подозрение - то, что где-нибудь вдоль строки существует неудавшаяся транзакция MSDTC, соединение было возвращено к пулу, и следующий запрос на другой странице берет неправильно себя ведущее соединение и получил эту конкретную ошибку. Забавная вещь, мы получили эту ошибку на запросе, который не имеет никакой потребности вообще с распределенной транзакцией (соглашающийся на две базы данных, и т.д.). Мы только делали запрос Select (никакая транзакция), когда мы получили ошибку.
Мы сделали Профилирование SQL, и запрос добрался, работал на SQL Server, но никогда не возвращался (так как транзакция MSDTC была уже прервана в соединении).
Некоторые другие связанные ошибки сопровождать это:
Награда может помочь получить ответ, который вы ищете, но вы, вероятно, получите более точные ответы, если дадите несколько примеров кода и лучше опишите, когда возникает ошибка.
Ошибка возникает только периодически? Это похоже на ваше описание.
Включаете ли вы закрытие, которое хотите выполнить, как транзакцию в блок с использованием TransactionScope
, как рекомендует Microsoft? Это должно помочь избежать странного поведения транзакции. Напомним, что блок using
гарантирует, что объект всегда удаляется независимо от созданных исключений. См. Здесь: http://msdn.microsoft.com/en-us/library/ms172152.aspx
Если вы используете TransactionScope
, есть аргумент System.TransactionScopeOption .RequiresNew
, который сообщает платформе всегда создавать новую транзакцию для этого блока кода:
Использование ts как новых транзакций.TransactionScope (Transactions.TransactionScopeOption.RequiresNew) 'Делай что-нибудь Конец использования
Кроме того, если вы подозреваете, что в соединении произошел сбой, а затем он был помещен обратно в пул соединений, наиболее вероятным решением будет заключить код, который может вызвать сбой соединения, в блоке Try-Catch и Dispose
соединение в блоке захвата.
Я видел это раньше, и причина была именно в том, что вы думали. Как предложила Райс, убедитесь, что вы правильно удаляете объекты, связанные с db, чтобы избежать этой проблемы.
MSDTC по умолчанию имеет тайм-аут 90 секунд, если один запрос превышает этот временной лимит, вы столкнетесь с этой ошибкой, когда транзакция попытается зафиксировать.