Когда тупик не тупик? - PullRequest
       0

Когда тупик не тупик?

6 голосов
/ 09 января 2012

Я задаю этот вопрос, потому что время от времени захожу в тупик, которого не понимаю.

Это сценарий:

Хранимая процедура, которая обновляет таблицу A:

UPDATE A
SET    A.Column = @SomeValue
WHERE  A.ID     = @ID

Хранимая процедура, которая вставляется во временную таблицу #temp:

INSERT INTO #temp (Column1,Column2)

SELECT B.Column1, A.Column2

FROM B

INNER JOIN A
  ON A.ID = B.ID

WHERE  B.Code IN ('Something','SomethingElse')

Я вижу, что может быть ожидание блокировки, но я не вижу, как возникнет тупик, я что-то упускаю из виду?

EDIT:

ПС, которые я здесь напечатал, являются явно упрощенными версиями, но я использую соответствующие столбцы. Структура обеих таблиц будет:

CREATE TABLE A (ID IDENTITY
                   CONSTRAINT PRIMARY KEY,
                Column VARCHAR (100))


CREATE TABLE B (ID IDENTITY
                   CONSTRAINT PRIMARY KEY,
                Code VARCHAR (100))

1 Ответ

1 голос
/ 13 января 2012

Попробуйте, так как в вызывающих блокировках для таблиц указывается имя таблицы и ключевое слово:

WITH(NOLOCK)

Итак, что-то вроде этого для вашего сценария:

    INSERT INTO #temp (Column1,Column2)

    SELECT B.Column1, A.Column2

FROM B WITH(NOLCOK)

INNER JOIN A WITH(NOLOCK)
  ON A.ID = B.ID

WHERE  B.Code IN ('Something','SomethingElse')

Посмотрите, как выgo then.

Вы также можете посмотреть таблицу подсказок для tsql, sql server, чтобы увидеть, какой из них подходит вам лучше всего.Тот, который я указал NOLCOK, не вызовет блокировок, а также пропустит заблокированные строки, так как их использует какой-то другой процесс, поэтому, если вам все равно, вы можете его использовать.

Я не уверен с временными таблицами, но вы можететакже используйте табличные подсказки с INSERT, INSERT INTO WITH (TABLE_HINT).

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