Главный вопрос в теме.
Более подробно: скажем, у нас есть таблица T с ограничением FK для таблицы U (для простоты, для ее PK, и обе таблицы используют кластеризованные индексы на своих PK). Теперь мы ВСТАВЛЯЕМ или ОБНОВЛЯЕМ строку в T, тем самым записывая значение FK. Насколько я понимаю,
блокировка X на всю транзакцию выдается для вставленной / измененной строки на T (и блокировки IX выше);
S-блокировка на всю транзакцию выдается на U для значения FK, чтобы никакая другая транзакция не могла получить блокировку X для этого ключа и изменить его.
Это верно? Если нет, то как работает принудительное применение ограничений 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"/>