Блокировка(или блокировка) происходит, когда два сеанса пытаются обновить одни и те же данные одновременно.
Первый сеанс блокирует данные, а второй сеанс должен дождаться завершения первого и снять блокировку.
В результате второй сеанс блокируется от обновления данных. После завершения первого сеанса возобновляется работа второго сеанса.
Как правило, блокировка происходит, когда один сеанс удерживает блокировку ресурса, а второй сеанс пытается получить конфликтующий тип блокировки на том же ресурсе.
На следующем рисунке показана блокировка SQL Server:
Обычно время, в течение которого первый сеанс блокирует данные, очень короткое. Когда он снимает блокировку, второй сеанс может получить свою собственную блокировку на ресурсе и продолжить обработку.
Блокировка — это неизбежная и изначально заложенная в конструкцию функция 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 может отличаться от указанных в этом примере.
В-третьих, вернитесь к первой транзакции и зафиксируйте ее:
COMMIT;
Как только первый сеанс завершает транзакцию, второй сеанс также завершается.
Краткое содержание
- Блокировка происходит, когда два сеанса пытаются обновить ресурс одновременно. Второй сеанс блокируется, поскольку ему приходится ждать завершения второго сеанса.
- Используйте хранимую процедуру sp_who2, чтобы проверить, какой SPID заблокирован другим SPID.