Понятие блокировок. Основные типы блокировок

Блокировка - это механизм, используемый для управления одновременным доступом к общему ресурсу. Блокирование происходит, когда один сеанс удерживает ресурс, запрашиваемый другим сеансом. В результате запрашивающий сеанс будет заблокирован - он "повиснет" до тех пор, пока удерживающий сеанс не завершит работу с ресурсом.

Оптимистическое блокирование (optimistic locking) - стратегия блокирования набора данных, при которой раздел, содержащий изменяемую запись, блокируется только на время внесения изменений в запись программой (пользовательским процессом), но не пользователем.

Пессимистическое блокирование (pessimistic locking) - стратегия блокирования набора данных, при которой раздел, содержащий изменяемую запись, блокируется на все время внесения изменений в запись пользователем и не доступна для редактирования другим пользователям.

Особенность механизма блокировок Oracle - блокировки данных не хранятся как отдельный ресурс, а содержатся непосредственно в блоках данных. Это позволяет избежать таких проблем, как эскалация блокировок. Ниже перечислены пять основных классов блокировок в Oracle. Первые три - общие (используются во всех базах данных Oracle), а две остальные — только в OPS (Oracle Parallel Server - параллельный сервер).

  1. Блокировки DML (Data Manipulation Language), то есть операторы INSERT, UPDATE и DELETE. К ним относятся, например, блокировки строки данных или блокировка на уровне таблицы, затрагивающая все строки таблицы.
  2. Блокировки DDL (Data Definition Language), то есть операторы CREATE, ALTER, DROP и так далее. Блокировки защищают определения структур объектов.
  3. Внутренние блокировки (internal locks) и защелки (latches). Защелки - это простые низкоуровневые средства обеспечения последовательности обращений. Защелки обычно запрашиваются системой в режиме ожидания. Это означает, что, если защелку нельзя установить, запрашивающий сеанс приостанавливает работу на короткое время, а затем пытается повторить операцию. Внутренние блокировки - более сложное средство обеспечения очередности доступа, они позволяют запрашивающему "встать в очередь" в ожидании освобождения ресурса.
  4. Распределенные блокировки (distributed locks). Эти блокировки используются сервером OPS для согласования ресурсов машин, входящих в кластер. Распределенные блокировки устанавливаются экземплярами баз данных, а не отдельными транзакциями.
  5. Блокировки параллельного управления кэшем (PCM - Parallel Cache Management Locks). Такие блокировки защищают блоки данных в кэше при использовании их несколькими экземплярами баз данных.

SQL Server поддерживает три основных типа блокировок:



  1. Shared Lock - разделяемая блокировка, которая используется при выполнении операции чтения данных. Позволяется чтение данных другой транзакцией, но запрещено изменение.
  2. Exclusive Lock - монопольная блокировка, которая применяется при изменении данных. Эта блокировка полностью запрещает доступ к данных другим транзакциям.
  3. Update Lock - блокировка обновления, которая является промежуточной между разделяемой и монопольной блокировкой. Используется, когда транзакция хочет обновить данные в какой-то ближайший момент времени, но не сейчас, и, когда этот момент придет, не хочет ожидать другой транзакции. В этом случае другим транзакциям разрешается устанавливать разделяемые блокировки, но не позволяет устанавливать монопольные.

Блокировки могут устанавливаться на трех уровнях:

  • Уровень строк - уровень по умолчанию.
  • Уровень страницы - используется для более эффективного использования ресурсов и в случае если в данной странице много строк с этой блокировкой.
  • Уровень таблицы - используется при операциях над таблицей и в случае эскалации блокировок.

Взаимоблокировки

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

Пример: create table T(i number, j number, s_i varchar(100), s_j varchar(100));

Транзакция 1 Транзакция 2
begin tran begin tran
update T set s_i = 'строка1' where i = 1  
  update T set s_j = 'строка3' where j = 1
update T set s_j = 'строка2' where j = 1  
Ожидание update T set s_i = 'строка4' where i = 1
  Ожидание

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

Репликация данных. Виды репликации

Репликация (replication) — механизм синхронизации содержимого нескольких копий объекта (например, содержимого БД). Репликация — это процесс, под которым понимается копирование данных из одного источника на множество других и наоборот.

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

Виды репликации

Репликация может быть синхронной или асинхронной, как описано ниже.

Синхронная репликация

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

В большинстве СУБД синхронная репликация реализуется с помощью триггерных процедур (возможно, скрытых и управляемых системой).

Недостаток: синхронная репликация создаёт дополнительную нагрузку при выполнении всех транзакций, в которых обновляются какие-либо реплики (также могут возникать проблемы, связанные с доступностью данных).

Наши рекомендации