2010-01-06 3 views
0

Имея странную проблему. Я тестирую приложение ASP.NET, которое я написал, что запрашивает SQL-сервер через AJAX. Приложение использует LINQ-to-SQL для загрузки данных примерно с 8 или около того таблиц в соединении, и каждый раз за раз вызов SQL-сервера блокируется и никогда не возвращается.LINQ-to-SQL Заблокирует SQL Server во время запроса?

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

Другие симптомы:

  1. Использование процессора на сервере шипы около 40% при выполнении этого вызова, и остается там, даже после закрытия приложения («Stopped» в Visual Studio).

  2. Сервер продолжает выполнять вызов до тех пор, пока я фактически не убью веб-сервер Visual Studio (Cassini), который живет в лотке.

  3. При взгляде на то, что делает сервер SQL, все, что мы видим, это то, что он выполняет вызов LINQ-to-SQL, ничего не выглядит обычным.

У кого-нибудь есть мысли о том, что это "пахнет"?

Спасибо, Сэм

ответ

1

Во-первых, обновить SQL сервера до самого последнего уровня пакета обновления. Возможно, вам захочется взглянуть на накопительные обновления, выпущенные после этого пакета обновления, и посмотреть, что-то похожее на вашу конкретную проблему. Возможно, это было разрешено.

SQL Server решит убить один из элементов мертвой блокировки, но это также зависит от того, каковы настройки тайм-аута запроса. Если ваш тайм-аут достаточно высок (300 секунд ...), SQL Server может продолжить выполнение вызова некоторое время.

Если возможно, вы можете использовать NOLOCK в своих таблицах в вызове sql, чтобы он был неблокирующим. Для Linq-To-Sql установите для уровня изоляции транзакции значение Read Uncommitted, это то же самое, что и NOLOCK.

Я бы дополнительно поставить на след вызовов LINQ-to-SQL, и повторно запустить их в SQL Profiler, чтобы увидеть, если есть что-то, что может быть настроен немного лучше, как лучше индексов и т.д.

+0

Спасибо, Крис. Я думал о том, чтобы идти по маршруту «NOLOCK», но сэкономил это для худшего случая. Я проверю параметры пакета обновления и тайм-аута - это может быть так. –

+0

Если грязные чтения в порядке (и они обычно есть), то использование NOLOCK - хорошая идея. SQL Server выбирает блок блокировки по умолчанию, который добавляет служебные данные и уменьшает время отклика запросов. В даже умеренно используемых системах блокировка по умолчанию может иметь негативное влияние, которое обычно является ненужным. – NotMe

+0

Хорошо - я проверю это. Я думаю, маловероятно, что любые два пользователя будут редактировать одни и те же записи одновременно в этой системе, поскольку это связано с начислением заработной платы для рабочего, и есть только один менеджер рабочего. Спасибо! –

0

Я видел подобное поведение в linq, если транзакция начинается, но никогда не завершается.

Смежные вопросы