Я получаю ошибку из-за тайм-аута при попытке выполнить LINQ (-к SQL) запрос
Система. Данные. SqlClient. SqlException: Тайм-аут истек. Период тайм-аута протек до завершения операции, или сервер не отвечает.
Теперь, это не просто случай медленного запроса:
Тот последний объект заставил меня думать, что я получаю своего рода мертвую блокировку стороны базы данных: запрос заблокирован блокировкой где-нибудь, и период тайм-аута протекает, уничтожая остановленное соединение.
Проблема с этой идеей состоит в том, что я только делаю, выбирает в DataContext, это вызывает проблемы. (Я действительно имею, вставляет появление в другой database/DataContexts.) У меня также нет явных транзакций. Это сбивает меня с толку немного: поведение запроса точно походит на мертвую блокировку, но у меня никогда не было мертвой блокировки, которая не была вызвана своего рода проблемой изоляции транзакции прежде - и это не похоже на случай здесь (на первый взгляд так или иначе).
Я ищу совет относительно того, как отладить эту проблему. На какие виды вещей я должен смотреть определить причину этой проблемы?
Некоторые примечания, которые могут быть полезными:
union
присоединиться к результатам нескольких запросов вместеЯ закончил тем, что решил базовую проблему путем переделки моего запроса. Оригинал называл несколько таблиц несколько раз (через различные взгляды). Переделанная версия, обойденная все это, и тайм-ауты, исчезла.
снова запустите ваш код из приложения, пока оно ожидает (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
он покажет вы все блоки на время бега.
Вы уверены, что пул соединений не поглощается несобранными ресурсами?
Попробуйте заключить SqlDataContext в блок using и посмотрите, сохраняется ли проблема.