Подтвердить что ты не робот

Распределенная транзакция завершена. Либо закрепите этот сеанс в новой транзакции, либо в транзакции NULL

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

Сценарий следующий:

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

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

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

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

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

Ответ 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, чтобы избежать этой проблемы.