Распределенная транзакция завершена. Либо подключите этот сеанс к новой транзакции, либо к транзакции NULL. - PullRequest
22 голосов
/ 30 июня 2009

Просто любопытно, если кто-то еще получил эту конкретную ошибку и знает, как ее решить?

Сценарий выглядит следующим образом ...

У нас есть веб-приложение ASP.NET, использующее Enterprise Library, работающее на ферме IIS Windows Server 2008, подключающееся к серверной части кластера SQL Server 2008. MSDTC включен. Соединения с БД объединяются.

Я подозреваю, что где-то вдоль линии произошла неудачная транзакция MSDTC, соединение было возвращено в пул, и следующий запрос на другой странице обнаруживает неправильное соединение и получает эту конкретную ошибку. Забавно, что мы получили эту ошибку в запросе, который вообще не нуждается в распределенной транзакции (фиксация двух баз данных и т. Д.). Мы выполняли запрос на выборку (без транзакции), только когда получили ошибку.

Мы выполнили SQL Profiling, и запрос был запущен на SQL Server, но не вернулся (поскольку транзакция MSDTC уже была прервана в соединении).

Некоторые другие связанные с этим ошибки:

  • Новый запрос не разрешен к запуску потому что это должно прийти с действительным дескриптор транзакции.
  • Внутренняя ошибка поставщика данных .Net Framework 60.

Ответы [ 4 ]

3 голосов
/ 20 августа 2010

MSDTC имеет тайм-аут по умолчанию 90 секунд. Если один запрос превысит это ограничение по времени, вы столкнетесь с этой ошибкой, когда транзакция пытается зафиксировать.

3 голосов
/ 23 июля 2010

Награда может помочь получить ответ, который вы ищете, но вы, вероятно, получите лучшие ответы, если дадите несколько примеров кода и дадите лучшее описание того, когда произошла ошибка.

Ошибка возникает только периодически? Похоже, это из вашего описания.

Включаете ли вы закрытие, которое вы хотите сделать, как транзакцию в блоке using TransactionScope, как рекомендует Microsoft? Это должно помочь избежать странного поведения транзакции. Напомним, что блок using гарантирует, что объект всегда находится вне зависимости от создаваемых исключений. Смотрите здесь: http://msdn.microsoft.com/en-us/library/ms172152.aspx

Если вы используете TransactionScope, существует аргумент System.TransactionScopeOption.RequiresNew, который указывает платформе всегда создавать новую транзакцию для этого блока кода:

    Using ts As New Transactions.TransactionScope(Transactions.TransactionScopeOption.RequiresNew)
        ' Do Stuff
    End Using

Кроме того, если вы подозреваете, что соединение обрывается и затем помещается обратно в пул соединений, вероятным решением является включение кода, который может вызвать сбой соединения, в блок Try-Catch и Dispose соединение в блоке улова.

1 голос
/ 12 июня 2013

Старый вопрос ... но столкнулся с этой проблемой в последние несколько дней.

Не смог найти хорошего ответа до сих пор. Просто хотел поделиться тем, что узнал.

Мой сценарий содержит несколько сеансов, открываемых несколькими фабриками сеансов. Мне пришлось правильно откатить и подождать и убедиться, что другие транзакции больше не активны. Кажется, что откат одного из них откатит все.

Но после добавления Thread.Sleep () между откатами он не делает другого и продолжает нормально откатываться. Последующие обращения, запускающие метод, не приводят к тому, что «Новый запрос не может быть запущен, потому что он должен идти с допустимым дескриптором транзакции» ошибка.

https://gist.github.com/josephvano/5766488

0 голосов
/ 23 июля 2010

Я видел это раньше, и причиной было именно то, что вы думали. Как предложила Райс, убедитесь, что вы правильно утилизируете связанные с БД объекты, чтобы избежать этой проблемы.

...