В настоящее время мы тестируем переход на уровень совместимости (cl) 130 (вместо 100) в нашей среде разработки (sql server 2016).После переключения мы заметили некоторые ошибки:
could not execute batch command.[SQL: SQL not available] Transaction (Process ID 54) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
После некоторых исследований, трассировки и отладки я смог подтвердить, что у нас действительно была проблема взаимоблокировки.Мы используем приложение .net, которое, используя nhibernate, получает доступ к базе данных.Некоторые внутренние задачи (в приложении .net) могут быть настроены на параллелизм для более быстрого завершения.Эти задачи обычно разделяют их рабочую нагрузку таким образом, что (строка) взаимоблокировка должна быть невозможной.Т.е. Задача 1 и Задача 2 могут обращаться к Таблице A и Таблице B примерно в одно и то же время, но они никогда не получат доступ к одним и тем же строкам в каждой таблице.
Задачи вызывают некоторые хранимые процедуры, которые делают что-то простое, например:
UPDATE dbo.Tab1
SET dbo.Tab1.Col1 = 'ValueY'
FROM dbo.Tab2
JOIN dbo.Tab3
JOIN dbo.Tab4
…
WHERE Tab1.Col.2 = 'ValueX'
По сути, это будет проходить через Tab1, искать строки для обновления и обновлять их.
Все это работало нормально на уровне совместимости (cl) 100. После перехода на cl 130 у нас иногда бывают тупики, с которыми мы раньше не сталкивались.
График взаимоблокировки показывает две блокировки ключа для одного и того же объекта id / hobt id, где два разных серверных процесса удерживают X-Lock и запрашивают U.
Если я добавляю нерелевантные строки вТаблица Tab1, для данного конкретного теста, увеличит количество страниц до 23, и проблем больше не будет.
Я прочитал, что эта проблема может быть вызвана небольшим количеством строк / страниц.Оптимизатор / сервер ведет себя по-другому по сравнению с таблицей с миллионами строк, что приводит к другому поведению блокировки и может привести к взаимоблокировкам.
Но это не отвечает на мой Вопрос : совместимость совместима?Уровень, при переключении со 100 на 130, напрямую влияет на блокировку и может даже вызывать проблемы взаимоблокировки, если их раньше не было?
PS: Это не проблема эскалации блокировки, так как я отключил ее для Таблицы Tab1.