Назад | Перейти на главную страницу

SQL Server: используются ли общие блокировки для принудительного применения ограничений внешнего ключа и как долго они хранятся?

Главный вопрос в теме.

Более подробно: скажем, у нас есть таблица T с ограничением FK для таблицы U (для простоты, для ее PK, и обе таблицы используют кластеризованные индексы на своих PK). Теперь мы ВСТАВЛЯЕМ или ОБНОВЛЯЕМ строку в T, тем самым записывая значение FK. Насколько я понимаю,

Это верно? Если нет, то как работает принудительное применение ограничений FK и какие блокировки оно устанавливает?

Это объяснило бы тупиковые ситуации в нашей параллельной системе ETL.

(Я не нашел этому объяснения, в том числе и в общедоступных местах вроде https://www.microsoftpressstore.com/articles/article.aspx?p=2233327&seqNum=3; Кроме того, общее понимание, похоже, таково, что «разделяемые блокировки снимаются, как только SQL Server прочитал и обработал заблокированные данные», что в некотором роде противоречит моим S-блокировкам на время транзакций ...).

РЕДАКТИРОВАТЬ: Вот выдержка из графика тупиков:

Delete from ProduktGtin ....
...
INSERT INTO dbo.Produktzusatz ....
...
   <pagelock fileid="1" pageid="33949422" ...
     <owner id="processc45d4e8c8" mode="IX"/>
     <waiter id="process780a4c8c8" mode="U" requestType="wait"/>
   <pagelock fileid="1" pageid="6935000" ...
     <owner id="process780a4c8c8" mode="IX"/>
     <waiter id="processc45d4e8c8" mode="S" requestType="wait"/>