Я использую блокировку строки с сервером 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
Единственное решение, которое мне удалось найти, - это добавить поддельные записи в таблицу. Что я ненавижу делать, потому что я очень разборчив в поддержании своей базы данных в чистоте.
Кто-нибудь сталкивался с этой проблемой и, возможно, найдет другое решение?