Распределенная транзакция завершена. Либо закрепите этот сеанс в новой транзакции, либо в транзакции NULL
Просто любопытно, есть ли у кого-то еще эта ошибка и знаете, как ее решить?
Сценарий следующий:
У нас есть веб-приложение ASP.NET, использующее корпоративную библиотеку, запущенную на ферме IIS Windows Server 2008, которая подключается к задней панели кластера SQL Server 2008.
MSDTC включен. Соединения DB объединены.
Мое подозрение в том, что где-то вдоль линии произошла сбойная транзакция MSDTC, соединение было возвращено в пул, а следующий запрос на другой странице подхватил неправильное соединение и получил эту конкретную ошибку. Забавно, что мы получили эту ошибку в запросе, который не нуждается в распределении транзакций (для двух баз данных и т.д.). Когда мы получили ошибку, мы делали запрос select (без транзакции).
Мы выполнили SQL-профилирование и запрос был запущен на SQL Server, но так и не вернулся (поскольку транзакция MSDTC уже была прервана в соединении).
Некоторые другие связанные с этим ошибки:
- Новый запрос не разрешен
потому что он должен соответствовать действительности
дескриптор транзакции.
- Внутренняя ошибка поставщика данных .Net Framework 60.
Ответы
Ответ 1
Баунти может помочь получить ответ, который вы ищете, но вы, вероятно, получите более качественные ответы, если вы дадите примеры кода и дадите лучшее описание, когда произойдет ошибка.
Возникает ли ошибка только с перерывами? Это похоже на описание.
Включите ли вы закрытие, которое вы хотите сделать в качестве транзакции в блоке 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
соединения в блоке catch.
Ответ 2
MSDTC имеет тайм-аут по умолчанию 90 секунд, если один запрос превышает этот срок, вы столкнетесь с этой ошибкой, когда транзакция пытается зафиксировать.
Ответ 3
Старый вопрос... но столкнулся с этим вопросом несколько дней.
Не удалось найти хороший ответ до сих пор. Просто хотел поделиться тем, что узнал.
Мой сценарий содержит несколько сеансов, которые открываются несколькими сессионными фабриками. Я должен был правильно откат и ждать и убедиться, что другие транзакции больше не активны. Кажется, что только откат одного из них отбросит все.
Но после добавления Thread.Sleep() между откатами он не делает другого и продолжает отменять откат. Последующие хиты, которые запускают этот метод, не приводят к тому, что "Новый запрос не запускается, потому что он должен иметь действующий дескриптор транзакции". ошибка.
https://gist.github.com/josephvano/5766488
Ответ 4
Я видел это раньше, и причина была именно тем, что вы думали. Как предложил Райс, убедитесь, что вы правильно распоряжаетесь объектами, связанными с db, чтобы избежать этой проблемы.