Предположим, у нас есть таблица Users
с тремя столбцами.SQL Server: блокировки и эксклюзивный тип выбора
UserId - primary key clustered int
Username - nvarchar(50)
CityId - int, which has a non-unique non-clustered index (mouthful).
Если я избранная и с эксклюзивным замком и начать тран на одной вкладке:
declare @CityId int = 10
begin tran
SELECT *
FROM [dbo].Users WITH (XLOCK,INDEX (MyCityIndex))
WHERE CityId = @CityId
И заметьте, я не совершает или откат транзакции.
Тогда в другом (YES ДРУГОЙ TAB ELSE SQL СДЕЛАЕТ НЕКОТОРУЮ ОПТИМИЗАЦИЯ И не будут работать) вкладку, я бегу:
declare @CityId int = 10
begin tran
SELECT *
FROM [dbo].Users WITH (XLOCK, INDEX (MyCityIndex))
WHERE CityId = @CityId
Это, очевидно, будет блокировать, если я использую тот же CityId
(10). Но я думаю, что произойдет, если я использую CityId = 11
?
declare @CityId int = 11
Будет работать.
Но он будет работать, если я сделаю поиск подсказок индекса, иначе он не сработает, и даже если я поставлю CityId = 11
, тогда он будет блокировать и ждать другого транса, который не удастся.
Что здесь происходит?
Когда он считывает данные с использованием исключительной блокировки, выполняет полное сканирование таблицы, а затем, когда он попадает в запись, в которую он заблокирован, заблокирован? В самом деле?
Что произойдет, если индексы будут фрагментированы и попадут в строку, которая фактически заблокирована, которая не содержит ее идентификатора. Будет ли это блокироваться?
При проведении тестирования используйте два разных вкладки для выбора, потому что здесь есть оптимизация SQL Server.
Я использую 2014
ty для ответа, но вы все еще не ответили на мой вопрос. На самом деле нажимает запись блокировки при выполнении инструкции «select ... where ..», block? Что делать, если индекс фрагментирован и содержит данные, которых не должно быть. Будет ли мое решение по-прежнему работать? – Aflred
@Aflred, я добавил сценарий к моему ответу, который показывает, что запрос не будет заблокирован поиском даже без подсказки индекса. Фрагментация не приводит к тому, что индексные страницы содержат данные, которые не должны; это может уменьшить ожидаемую продолжительность жизни страницы и вызвать больше ввода-вывода. –
Точное поведение, которое я получаю, и это правильно, и вы сами пытаетесь это сделать. Да, вы ответили на весь мой вопрос: «Фрагментация не приводит к тому, что индексные страницы содержат данные, которые не должны; это может уменьшить ожидаемую продолжительность жизни страницы и вызвать больше IO ', поэтому thats that.I было неправильно в отношении индексов.' Я предполагаю, что все зависит от плана оптимизации sql. – Aflred