Насколько я понял, NOLOCK в данном случае лишь позволяет закончить первую сессию и сделать DELETE in t1. В случае выполнения без этого хинта, DELETE заблокируется by (S) lock on t1 и мы получим deadlock. И такая комбинация действий в обоих случаях обречена на failure :)
А какие блокировки наблюдаются во время этих длинных TRUNCATE? Возможно какие-то системные вьюхи залочены и остальные сессии ждут
Плюсую про неверное утверждение о неоткатности TRUNCATE
Добрый вечер, спасибо за статью. Эта проблема была решена с помощью deferred compilation in SQL Server 2019. Please find details in https://www.mssqltips.com/sqlservertip/5662/table-variable-deferred-compilation-in-sql-server/
Насколько я понял, NOLOCK в данном случае лишь позволяет закончить первую сессию и сделать DELETE in t1. В случае выполнения без этого хинта, DELETE заблокируется by (S) lock on t1 и мы получим deadlock. И такая комбинация действий в обоих случаях обречена на failure :)
Параллельная вставка уводит нас к разговору о латчах :)
Выбор уровня изоляции - баланс между целостностью данных и временем (блокировками). Ваше решение реализует смешанный подход, спасибо за обзор :)
А нужно было правильно применить уровень изоляции транзакций — так, чтобы блокировка на вставку и обновление данных была минимальной
Если я ничего не путаю, (X) блокировка накладывается до конца транзакции на любом уровне изоляции