Как принудительно использовать блокировки строк?

Я пытаюсь заставить таблицу использовать блокировки строк. Я уже отключил эскалацию блокировки. Уровень изоляции READ_COMMITTED_SNAPSHOT

alter table <TABLE_NAME> SET (LOCK_ESCALATION=DISABLE)
go
alter index <INDEX_NAME> ON <TABLE_NAME> SET (ALLOW_PAGE_LOCKS=OFF) 
go

Он не работает после установки этого параметра.

Нужно ли мне перестраивать таблицу, чтобы она не использовала блокировку страницы?

6 голосов | спросил grassbl8d 26 12012vEurope/Moscow11bEurope/MoscowMon, 26 Nov 2012 11:20:11 +0400 2012, 11:20:11

1 ответ


12

Параметр блокировки блокировки страниц применяется для каждого индекса, поэтому применение этого изменения к кластерному индексу влияет только на планы выполнения, которые обеспечивают доступ к данным через этот индекс. Если в таблице есть некластеризованные индексы, возможно, вам также придется отключить блокировку страниц. Следующий сценарий демонстрирует это:

CREATE TABLE dbo.LockTest
(
    col1    integer IDENTITY NOT NULL,
    col2    integer NOT NULL,
    col3    integer NOT NULL,

    CONSTRAINT PK_LockTest
        PRIMARY KEY CLUSTERED (col1)
);
GO
CREATE UNIQUE NONCLUSTERED INDEX UQ_LockTest
ON dbo.LockTest (col2);
GO
ALTER TABLE dbo.LockTest SET (LOCK_ESCALATION=DISABLE);
ALTER INDEX PK_LockTest ON dbo.LockTest SET (ALLOW_PAGE_LOCKS=OFF);

Использование кластерного индекса в качестве метода доступа:

-- Error 651:
-- Cannot use the PAGE granularity hint on the table "dbo.LockTest"
-- because locking at the specified granularity is inhibited.
SELECT col1
FROM dbo.LockTest WITH (INDEX(PK_LockTest), PAGLOCK);

Использование некластеризованного индекса:

-- Succeeds: page locks allowed on index UQ_LockTest
SELECT col2 FROM dbo.LockTest AS lt WITH (PAGLOCK);

-- Succeeds: UQ_LockTest also includes col1
-- NC indexes always include the clustering key
SELECT col1 FROM dbo.LockTest AS lt WITH (PAGLOCK);

-- Fails: cannot retrieve col3 without touching the clustered index
SELECT col3 FROM dbo.LockTest AS lt WITH (PAGLOCK);

Обратите внимание, что отключение блокировки страницы может иметь неожиданные побочные эффекты, такие как предотвращение реорганизации индекса (поскольку этот процесс работает на уровне страницы):

-- Error 1943:
-- The index "PK_LockTest" on table "LockTest" cannot
-- be reorganized because page level locking is disabled.
ALTER INDEX PK_LockTest ON dbo.LockTest REORGANIZE;

-- Succeeds (page locking available):
ALTER INDEX UQ_LockTest ON dbo.LockTest REORGANIZE;
ответил Paul White 30 52012vEurope/Moscow11bEurope/MoscowFri, 30 Nov 2012 06:16:41 +0400 2012, 06:16:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132