Несколько проблем TransactionScope

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

, Который сказал..., существует одно исключение к этому; если единый запрос генерирует несколько агрегатов, поставщик L2S переводит его в выполнение больших запросов с одним подзапросом на агрегат. Для большой таблицы это может оказать значительное влияние ввода-вывода, когда ввод-вывод дб, стоивший за запрос, растет величинами для каждого нового агрегата в запросе.

обходное решение для этого должно, конечно, переместить агрегаты в сохраненный proc или представление. У Matt Warren есть некоторый пример кода для альтернативного поставщика запроса, которые переводят такие запросы более эффективным способом.

Ресурсы:

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx? FeedbackID=334211

http://blogs.msdn.com/mattwar/archive/2008/07/08/linq-building-an-iqueryable-provider-part-x.aspx

6
задан boj 27 August 2009 в 15:07
поделиться

2 ответа

Это исключение нельзя отладить без полной трассировки стека. Он имеет разное значение в зависимости от контекста. Обычно это означает, что вы делаете то, чего не должны делать внутри транзакции, но, не видя вызовов db или трассировки стека, все, что можно сделать, - это догадаться. Некоторые распространенные причины, о которых я знаю (и я уверен, что они далеко не исчерпывающие), включают:

  1. Доступ к нескольким источникам данных (т. Е. К различным строкам подключения) внутри вложенной TransactionScope . Это вызывает продвижение к распределенной транзакции, и если вы не используете DTC, это не удастся. Обычно ответ не для включения DTC, а для очистки транзакции или завершения доступа к другим данным с помощью нового TransactionScope (TransactionOptions.RequiresNew) .
  2. Необработанные исключения в TransactionScope .
  3. Любая операция, которая нарушает уровень изоляции, например, попытка чтения только что вставленных / обновленных строк.
  4. Тупиковые ситуации SQL; транзакции могут даже блокироваться в определенных случаях, но если применяется №1, изоляция других операций в новых транзакциях может вызвать взаимоблокировки, если вы не будете осторожны.
  5. Таймауты транзакций.
  6. Любая другая ошибка из базы данных.

Я определенно не знаю всех возможных причин, но если вы опубликуете полную трассировку стека и фактические вызовы db в своем коде, я посмотрю и дам вам знать, если что-нибудь увижу.

9
ответ дан 8 December 2019 в 18:39
поделиться

У вас есть два вложенных объекта TransactionScope ??

И нет блока try catch.

http://msdn.microsoft.com/en-us/library/system.transactions. transactioncope.aspx

Я думаю, вы найдете конкретный ответ: вы не можете завершить транзакцию, которая еще не началась, она находится в недопустимом состоянии. У вас действительно есть какой-нибудь код, в котором находятся ваши комментарии LINQ? действительно ли соединение устанавливается?

4
ответ дан 8 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: