В приложении asp.net 2.0, которое я поддерживаю, мы столкнулись с проблемами с прерываниями транзакции (тайм-аут). Сбой кода, похоже, вызывает тайм-аут, тогда функция ведения журнала страницы, использующая транзакцию (конструктор по умолчанию), терпит неудачу (но не всегда). Тайм-аут установлен на 2 минуты.Исключение тайм-аутов транзакций и пулов соединений
Некоторые пример кода, который подобен тому, что мы имеем в нашем приложении ниже:
Try
Dim scope As TransactionScope = New TransactionScope(TransactionScopeOption.Required, New TimeSpan(0, 0, CInt(TransactionTimeout)))
**A method call that fails is here**
Using scope
**other code is here**
scope.complete
end using
catch
Из того, что я видел и читал, я думаю не в том, что, так как с помощью блока не достигается, сделка время вышло. Затем код регистрации (выполненный с любым запросом страницы) пытается заручиться в существующей транзакции, которая имеет тайм-аут и приводит к ошибке прерывания транзакции (как только вызывается конструктор). Правильно ли это предположение? Почему только некоторые запросы терпят неудачу в будущем и не все (при условии, что все они используют транзакцию)?
Мой большой вопрос заключается в том, как объединение пулов в этом играет? Если пользователь A обращается к плохому коду, может ли это повлиять на пользователя B? Это поведение, которое мы видели. Если нет, что еще может вызвать это? Я был в MSDN, но я не могу найти ничего, что действительно щелкает со мной относительно того, что происходит и почему.
Вот соответствующая часть строки соединения:
Enlist=true;Pooling=true;Connection Lifetime=20;Max Pool Size=25;Min Pool Size=5
FYI. Не уверен, что это актуально, но приложение использует базу данных Oracle 11g с шаблоном фабрики базы данных EntLib.
Спасибо за помощь.
Спасибо за предложения по изменению кода. Мы абсолютно внесем некоторые изменения.Можете ли вы подтвердить, что мое понимание общей проблемы имеет смысл - экземпляр TransactionScope создается, возникает ошибка и предотвращает выполнение строки scope.complete, поэтому время соединения заканчивается. Причинение последующих объектов transactionScope, которые завершают эту транзакцию, немедленно прекратить использование причины таймаута. Если это правильно, что происходит с соединением? Остается ли он в пуле? Это может привести к тому, что другой пользователь получит ту же ошибку, не попав в проблемный код? –
Ваше понимание верное. Я считаю, что происходит, так как соединения никогда не закрываются/не завершаются, они никогда не возвращаются в пул соединений, который в итоге заполняется. Когда в пуле нет доступных подключений, пользователи начинают получать тайм-ауты. –
Спасибо. Я не смог найти ничего, что бы точно объясняло, что происходит в этом сценарии. –