При разработке приложений, использующих базы данных, в большинстве случаях не нужно заботиться об управлении блокировками. Всю работу с блокировками выполняет модуль сервера, который называется менеджером блокировок. Однако MS SQL Server позволяет осуществлять различные уровни блокировок, как отдельной строки таблицы, так и базы данных в целом.
Менеджер блокировок, анализируя запросы к базе данных, автоматически выбирает тот или иной уровень блокировки, основываясь на том, какой количество данных участвует в запросе, и какой тип запроса был запрошен пользователем. Такой алгоритм работы позволяет установить равновесие между производительностью СУБД и возможностью получать данные другими пользователями.
Блокировки на уровне строки выполняются в том случае, когда происходит изменение данных в строке таблицы. Этот тип блокировки позволяет наиболее точно управлять доступом к данным, т.к. блокируются только те строки, которые действительно требуется изменить. С одной таблицей базы данных могут одновременно работать несколько пользователей с минимальными задержками системы. Но в результате увеличивается число операций по установке и снятию блокировок, а также увеличивается количество служебной информации, которая необходима для отслеживания установленных блокировок.
При блокировке на уровне таблицы выполняется блокировка всей таблицы, вне зависимости от того, какие и сколько данных требуется изменить в таблице. При установке такого типа блокировки, производительность системы существенно возрастает, т.к. требуется всего один раз установить блокировку перед началом выполнения транзакции, и один раз снять блокировку, после окончания выполнения транзакции. При этом пользователь получает максимальную скорость доступа к данным, поскольку другим пользователям эта таблица становится недоступна. Все остальные пользователи, которые отправляют запросы к заблокированной таблице, ожидают, пока текущий пользователь не закончит работу с таблицей и блокировка будет снята.
Различают два типа запросов при работе с базой данных: запрос на чтение данных, и запрос на изменение данных. Запросы на изменение данных включают в себя множество запросов на добавление, удаление и изменение данных. Основываясь на тип запроса, сервер может установить следующие типы блокировок:
• Коллективные блокировки. Устанавливаются при выполнении запроса на получение данных из таблицы (SELECT). При установленной блокировке данного типа, пользователь может быть уверен, что никто не изменит данные, которые в данный момент времени считываются из таблиц. Однако остальные пользователи также могут считать эти же данные.
• Блокировка обновления. При установленной коллективной блокировке на ресурс, попытка установить блокировку обновления приведет к тому, что ни одна последующая транзакция не сможет установить блокировку обновления или коллективную блокировку на данный ресурс.
• Монопольная блокировка. Данный тип блокировки применяются в том случае, когда транзакция выполняет запрос на изменение данных. Если установлена монопольная блокировка на ресурс, то другие пользователи не могут получить доступ к заблокированному ресурсу ни на чтение, ни на изменение данных.
• Блокировка массивного обновления. Данный тип блокировок устанавливается сервером базы данных при выполнении массивного копирования данных в таблицы. Она запрещает обращение к таблице всем другим пользователям. Но, в тоже время, несколько запросов массированного копирования, могут одновременно добавлять строки в таблице.
Кроме основных типов блокировки, которые были описаны выше, сервер MS SQL Server позволяет устанавливать также ряд специальных блокировок, которые повышают производительность сервера и функциональность обработки данных. Такие блокировки получили название «блокировки намерений», и применяются сервером в том случае, если транзакция намеревается получить доступ к данным.
Помимо блокировок данных, в MS SQL Server имеется возможность также наложить блокировки на диапазон ключей, и блокировка схемы (метаданные, описывающие структуру объектов базы). Блокировка диапазона ключей позволяет предотвратить возникновение фантомов и обеспечивает сериализуемость транзакций. При использовании данного типа блокировки, остаются заблокированными те данные, которые соответствуют определенному логическому условию, которое было использовано при выборке данных. Блокировка схемы применяется при выполнении запросов на изменение структуры таблиц базы данных и позволяет обеспечить целостность структуры базы данных.