Блокировка SQL-сервера

Блокировка(или блокировка) происходит, когда два сеанса пытаются обновить одни и те же данные одновременно.

Первый сеанс блокирует данные, а второй сеанс должен дождаться завершения первого и снять блокировку.

В результате второй сеанс блокируется от обновления данных. После завершения первого сеанса возобновляется работа второго сеанса.

Как правило, блокировка происходит, когда один сеанс удерживает блокировку ресурса, а второй сеанс пытается получить конфликтующий тип блокировки на том же ресурсе.

На следующем рисунке показана блокировка SQL Server:

Блокировка SQL-сервера

Обычно время, в течение которого первый сеанс блокирует данные, очень короткое. Когда он снимает блокировку, второй сеанс может получить свою собственную блокировку на ресурсе и продолжить обработку.

Блокировка — это неизбежная и изначально заложенная в конструкцию функция SQL Server с параллелизмом на основе блокировок. Это нормальное поведение, которое не влияет на производительность сервера.

Пример блокировки SQL Server

Для демонстрации мы создадим новую базу данных HR с таблицей под названием «Люди»:

DROP DATABASE IF EXISTS HR;
GO 
CREATE DATABASE HR;
GO
USE HR;
CREATE TABLE People(
  Id int IDENTITY PRIMARY KEY,
  FirstName varchar(50) NOT NULL,
  LastName varchar(50) NOT NULL
);
INSERT INTO People(FirstName, LastName)
VALUES ('Jane', 'Doe');
SELECT * FROM People;

Таблица People содержит одну строку с идентификатором 1.

Сначала начните транзакцию и обновите LastName строки с Id 1 на «Smith»:

BEGIN TRAN;
UPDATE People
SET LastName = 'Smith'
WHERE Id = 1;

Обратите внимание, что мы не фиксировали и не откатывали транзакцию в первом сеансе.

Во-вторых, создайте новый сеанс. Во втором сеансе обновите LastName строки с идентификатором 1 на 'Brown':

BEGIN TRAN;
UPDATE People
SET LastName = 'Brown'
WHERE Id = 1;
COMMIT;

Поскольку транзакция в первом сеансе продолжается, второй сеанс будет ждать завершения первого сеанса.

Если вы используете SQL Server Management Studio, вы увидите следующее сообщение:

Executing query....

Чтобы вывести список всех процессов, которые в данный момент подключены к SQL Server, используйте хранимую процедуру sp_who2.

sp_who2;

Выходные данные показывают, что идентификатор системного процесса(SPID) 55 заблокирован SPID 69. В этом примере первый сеанс — 69, а второй сеанс — 55. Обратите внимание, что ваш SPID может отличаться от указанных в этом примере.

Пример блокировки SQL Server

В-третьих, вернитесь к первой транзакции и зафиксируйте ее:

COMMIT;

Как только первый сеанс завершает транзакцию, второй сеанс также завершается.

Краткое содержание

  • Блокировка происходит, когда два сеанса пытаются обновить ресурс одновременно. Второй сеанс блокируется, поскольку ему приходится ждать завершения второго сеанса.
  • Используйте хранимую процедуру sp_who2, чтобы проверить, какой SPID заблокирован другим SPID.
Мирослав С.

Автор статей, ИБ-специалист