2013-07-31 3 views
0

У нас есть веб-приложение, построенное с использованием ASP.NET 4.0 (C#), и мы используем SQL Server 2005 в качестве бэкэнд.Частые блокировки SQL Server 2005

само приложение является механизмом документооборота, где каждая запись засвидетельствована четырьмя ролевыми каналами в течение 18 дней в месяц.

У нас примерно 200 тыс. Записей, которые поступают 1-го числа каждого месяца.

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

Мой вопрос или беспокойство в том, что мы часто сталкиваемся с проблемами взаимоблокировки в базе данных.

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

Мы активно используем хранимые процедуры с транзакциями. Есть ли способ кодирования таких ситуаций?

или просто избегать взаимоблокировок.

Извинения за то, что вы спрашиваете в такой случайной манере, но любые подсказки или советы приветствуются, и если вам нужна дополнительная информация, чтобы поднять эту проблему, то дайте мне знать.

благодаря

ответ

0

Несколько предложений:

1) Используйте тот же порядок для чтения/записи данных из/в таблицы.

Пример # 1 (чтение-запись взаимоблокировки): Избегайте создания хранимой процедуры usp_ReadA_WriteB, который считывает из A, а затем записывает в В и другой хранимой процедуры usp_ReadB_WriteA, который считывает из B, а затем записывает в A. Прочитайте это blog post пожалуйста.

Пример №2 (блокировка записи-записи): избегайте создания хранимой процедуры usp_WriteA_WriteB, которая записывает данные в таблицу A, а затем в таблицу B и другую хранимую процедуру usp_WriteB_writeA, которая записывает данные в те же таблицы: таблица B, а затем в таблицу A.

2) Минимум продолжительности транзакций. Минимизируйте затронутые строки, чтобы уменьшить количество блокировок. Обратите внимание на порог 5000 блокировок для lock escalation.

3) Оптимизируйте свои запросы. Например: найдите [Clustered]{Index|Table}Scan, {Key|RID} Lookup и Sort операторов в планах выполнения. Используйте индексы, но также старайтесь минимизировать количество индексов и пытаться минимизировать размер каждого индекса (сначала попытайтесь свести к минимуму размер индекса). Прочтите это blog post, пожалуйста.

+0

Brilliant; спасибо за ваши предложения - позвольте мне немного почитать. –

+0

Еще две вещи: 4) Во время транзакции вы должны исключить любое взаимодействие с пользовательским интерфейсом (так что избегайте «начинать транзакцию, ждать ввода пользователя, вставлять данные, завершать транзакцию»). 5) Если у вас длительные транзакции, которые влияют на многие строки, вы можете сохранить эти строки в переменных таблицы и выполнить окончательные модификации данных в конце транзакции (например, «BEGIN TRAN; ... INSERT INTO @TableVarA SELECT ... FROM. ..UPDATE @TableVarA ... INSERT INTO @TableVarB ... DELETE @TableVarB ... INSERT dbo.TableA SELECT FROM @TableVarA; UPDATE dbo.TableB SET ... FROM @TableVarB; COMMIT; '). Я использовал это решение с хорошими результатами. –