Как снять блокировку с таблицы в SQL Server 2005? - PullRequest
2 голосов
/ 19 января 2010

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

я получаюпроцедура зависает с функцией.

Может быть какое-то решение для того же?

Ответы [ 3 ]

3 голосов
/ 21 января 2010

Если я вас правильно слышу, вы говорите о вставке, которая блокирует себя, а не о двух отдельных запросах, блокирующих друг друга.

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

INSERT INTO bigtable
SELECT customerid, productid, ...
    FROM rawtable
    WHERE NOT EXISTS (SELECT CustomerID, ProductID From bigtable)
    AND ... (other conditions)

Это закончилось тем, что блокировало себя, потому что выбор в WHERE NOT EXISTS препятствовал выполнению INSERT.

Мы рассмотрели несколько различных вариантов, и я позволю вам решить, какой подход вам подходит:

  1. Изменение уровня изоляции транзакции (см. в этой статье MSDN ). Наш пакет служб SSIS по умолчанию был SERIALIZABLE, что является наиболее ограничительным. (обратите внимание, что перед тем, как выбрать этот параметр, будьте в курсе проблем с READ UNCOMMITTED или NOLOCK)
  2. Создать УНИКАЛЬНЫЙ индекс с IGNORE_DUP_KEY = ON . Это означает, что мы можем вставить ВСЕ строки (и полностью удалить предложение «ГДЕ НЕ ВХОДИТ»). Дубликаты будут отклонены, но пакет не завершится с ошибкой, и все остальные допустимые строки все равно будут вставлены.
  3. Измените логику запроса , чтобы сделать что-то вроде помещения всех строк-кандидатов во временную таблицу, затем удаления всех строк, которые уже находятся в месте назначения, и вставки остальных.

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

3 голосов
/ 19 января 2010

Это может быть трудно диагностировать. Microsoft предоставила некоторую информацию здесь:

INF: понимание и решение проблем с блокировкой SQL Server

Простой способ уничтожить соединение (я), вызывающее блокировку, задокументировано здесь:

http://shujaatsiddiqi.blogspot.com/2009/01/killing-sql-server-process-with-x-lock.html

Дополнительная информация о Microsoft здесь: http://support.microsoft.com/kb/323630

0 голосов
/ 21 января 2010

Насколько большой стол? Есть ли у вас проблемы, если вы вызываете процедуру из отдельных окон? Возможно, проблема связана с количеством данных, с которыми работает процедура, и отсутствием индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...