Отладка жесткого Тайм-аута LINQ-SQL

Я получаю ошибку из-за тайм-аута при попытке выполнить LINQ (-к SQL) запрос

Система. Данные. SqlClient. SqlException: Тайм-аут истек. Период тайм-аута протек до завершения операции, или сервер не отвечает.

Теперь, это не просто случай медленного запроса:

  • Я выполняю эквивалентный SQL в Studio управления SQL, и он завершается быстро (2 секунды)
  • Я устанавливаю свой CommandTimeout на 2 минуты.
  • Когда я выполняю тот же самый запрос в модульном тесте, он завершается успешно и быстро. Это: я только получаю этот тайм-аут, когда я выполняю этот запрос вместе с другими запросами. Тайм-аут всегда происходит в том же вызове.

Тот последний объект заставил меня думать, что я получаю своего рода мертвую блокировку стороны базы данных: запрос заблокирован блокировкой где-нибудь, и период тайм-аута протекает, уничтожая остановленное соединение.

Проблема с этой идеей состоит в том, что я только делаю, выбирает в DataContext, это вызывает проблемы. (Я действительно имею, вставляет появление в другой database/DataContexts.) У меня также нет явных транзакций. Это сбивает меня с толку немного: поведение запроса точно походит на мертвую блокировку, но у меня никогда не было мертвой блокировки, которая не была вызвана своего рода проблемой изоляции транзакции прежде - и это не похоже на случай здесь (на первый взгляд так или иначе).

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

Править

Некоторые примечания, которые могут быть полезными:

  • Я запрашиваю против представления что ссылки:
    • Другие представления в той же базе данных
    • Синонимы, которые указывают на таблицы в другой базе данных через Связанный сервер.
  • Это представление использует union присоединиться к результатам нескольких запросов вместе

ЭПИЛОГ

Я закончил тем, что решил базовую проблему путем переделки моего запроса. Оригинал называл несколько таблиц несколько раз (через различные взгляды). Переделанная версия, обойденная все это, и тайм-ауты, исчезла.

5
задан Craig Walker 10 March 2010 в 23:48
поделиться

2 ответа

снова запустите ваш код из приложения, пока оно ожидает (2 минуты ??), запустите это в окне запроса:

;with Blockers AS
(SELECT
     r.session_id AS spid
         ,r.cpu_time,r.reads,r.writes,r.logical_reads 
         ,r.blocking_session_id AS BlockingSPID
         ,LEFT(OBJECT_NAME(st.objectid, st.dbid),50) AS ShortObjectName
         ,LEFT(DB_NAME(r.database_id),50) AS DatabaseName
         ,s.program_name
         ,s.login_name
         ,OBJECT_NAME(st.objectid, st.dbid) AS ObjectName
         ,SUBSTRING(st.text, (r.statement_start_offset/2)+1,( (CASE r.statement_end_offset
                                                                   WHEN -1 THEN DATALENGTH(st.text)
                                                                   ELSE r.statement_end_offset
                                                               END - r.statement_start_offset
                                                              )/2
                                                            ) + 1
                   ) AS SQLText
     FROM sys.dm_exec_requests                          r
         JOIN sys.dm_exec_sessions                      s ON r.session_id = s.session_id
         CROSS APPLY sys.dm_exec_sql_text (sql_handle) st
     --WHERE r.session_id > 50
)
SELECT Blockers.* FROM Blockers

он покажет вы все блоки на время бега.

4
ответ дан 15 December 2019 в 00:58
поделиться

Вы уверены, что пул соединений не поглощается несобранными ресурсами?

Попробуйте заключить SqlDataContext в блок using и посмотрите, сохраняется ли проблема.

0
ответ дан 15 December 2019 в 00:58
поделиться
Другие вопросы по тегам:

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