SQL Блокировка записи сервера ведет себя по-разному в зависимости от количества записей - PullRequest
0 голосов
/ 06 февраля 2020

Я использую блокировку строки с сервером SQL. У меня есть несколько мест на SQL Server Express, а некоторые на SQL Server 2012 заполнены. У меня есть таблица, connected_invoices с первичным ключом и поле ticket_id. Поле ticket_id может быть дублировано в таблице.

У меня есть некластеризованный индекс (ix_ticket_id) в поле ticket_id.

Запрос, который я использую для извлечения данных:

select * from linked_invoices  With (rowlock xlock)  where ticket_id = 2000074703

Я обнаружил, что для таблиц, которые имеют менее 500 записей, таблица ВЕСЬ заблокирована.

В местоположениях, имеющих более 500 записей, блокируются только записи с ticket_id = 2000074703.

Я пытался принудительно использовать параметр with (index), чтобы оптимизатор запросов использовал ix_ticket_id, но это не помогает.

SELECT *
FROM linked_invoices WITH (ROWLOCK XLOCK INDEX (ix_ticket_id))
WHERE ticket_id = 2000084790

Я также пытался отключить lock_escalation ALTER TABLE connected_invoices SET (LOCK_ESCALATION = ВЫКЛЮЧЕНО)

Я также пытался перестроить индекс ix_ticket_id и отключить allow_page_locks

ALLOW_PAGE_LOCKS = OFF

Единственное решение, которое мне удалось найти, - это добавить поддельные записи в таблицу. Что я ненавижу делать, потому что я очень разборчив в поддержании своей базы данных в чистоте.

Кто-нибудь сталкивался с этой проблемой и, возможно, найдет другое решение?

...