Ниже приведен пример запроса, рассмотримБлокировка SQL Server Таблица во время массовой вставки
INSERT INTO Target (Col1,Col2,Col3,Col4) ----------------Statement#1
Select A.Col1,B.Col2,A.Col3,C.Col4 ----------------Statement#2
FROM A WITH(NOLOCK) INNER JOIN B WITH(NOLOCK)
ON A.Id = B.ID
LEFT JOIN C WITH NOLOCK
ON C.Id = B.ID
Where A.Id = 11
На каком этапе блокировка будет применяться на столе [монопольная блокировка?], Как SQL собирается выполнить запрос?
- Результат будет получен из таблиц A, B и C на основе ссылки join и where.
- При получении результата вставьте данные в таблицу и одновременно примените блокировку на таблице.
Так что, когда фактические данные записываются на странице таблицы, они заблокированы, но не во время выбора, даже если это INSERT INTO с SELECT?
Хорошо, его строка за строкой выборки и вставка? Это то, что вы хотите сказать? И какова будет продолжительность блокировки на целевой таблице, если запрос Select займет 500 мс, чтобы получить результат? – Hi10
1 & 2) В принципе, да. 3) С момента, когда X-блокировка будет получена до конца транзакции (если у вас есть [явная транзакция] (http://technet.microsoft.com/en-us/library/ms175127 (v = sql.105). aspx): COMMIT/ROLLBACK) или до конца выполнения оператора ([автоматическая фиксация транзакции] (http://technet.microsoft.com/en-us/library/ms187878 (v = sql.105) .aspx)) , Без 'TABLOCKX' блокировка X (на уровне записи: RID/KEY) приобретается непосредственно перед вставкой каждой записи в целевую таблицу. С подсказкой 'TABLOCKX' X-блокировка приобретается (на уровне таблицы) один раз в начале выполнения инструкции. –
Оцените свой ответ. – Hi10