Понятие блокировок. Основные типы блокировок
Блокировка - это механизм, используемый для управления одновременным доступом к общему ресурсу. Блокирование происходит, когда один сеанс удерживает ресурс, запрашиваемый другим сеансом. В результате запрашивающий сеанс будет заблокирован - он "повиснет" до тех пор, пока удерживающий сеанс не завершит работу с ресурсом.
Оптимистическое блокирование (optimistic locking) - стратегия блокирования набора данных, при которой раздел, содержащий изменяемую запись, блокируется только на время внесения изменений в запись программой (пользовательским процессом), но не пользователем.
Пессимистическое блокирование (pessimistic locking) - стратегия блокирования набора данных, при которой раздел, содержащий изменяемую запись, блокируется на все время внесения изменений в запись пользователем и не доступна для редактирования другим пользователям.
Особенность механизма блокировок Oracle - блокировки данных не хранятся как отдельный ресурс, а содержатся непосредственно в блоках данных. Это позволяет избежать таких проблем, как эскалация блокировок. Ниже перечислены пять основных классов блокировок в Oracle. Первые три - общие (используются во всех базах данных Oracle), а две остальные — только в OPS (Oracle Parallel Server - параллельный сервер).
- Блокировки DML (Data Manipulation Language), то есть операторы INSERT, UPDATE и DELETE. К ним относятся, например, блокировки строки данных или блокировка на уровне таблицы, затрагивающая все строки таблицы.
- Блокировки DDL (Data Definition Language), то есть операторы CREATE, ALTER, DROP и так далее. Блокировки защищают определения структур объектов.
- Внутренние блокировки (internal locks) и защелки (latches). Защелки - это простые низкоуровневые средства обеспечения последовательности обращений. Защелки обычно запрашиваются системой в режиме ожидания. Это означает, что, если защелку нельзя установить, запрашивающий сеанс приостанавливает работу на короткое время, а затем пытается повторить операцию. Внутренние блокировки - более сложное средство обеспечения очередности доступа, они позволяют запрашивающему "встать в очередь" в ожидании освобождения ресурса.
- Распределенные блокировки (distributed locks). Эти блокировки используются сервером OPS для согласования ресурсов машин, входящих в кластер. Распределенные блокировки устанавливаются экземплярами баз данных, а не отдельными транзакциями.
- Блокировки параллельного управления кэшем (PCM - Parallel Cache Management Locks). Такие блокировки защищают блоки данных в кэше при использовании их несколькими экземплярами баз данных.
SQL Server поддерживает три основных типа блокировок:
- Shared Lock - разделяемая блокировка, которая используется при выполнении операции чтения данных. Позволяется чтение данных другой транзакцией, но запрещено изменение.
- Exclusive Lock - монопольная блокировка, которая применяется при изменении данных. Эта блокировка полностью запрещает доступ к данных другим транзакциям.
- 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) — механизм синхронизации содержимого нескольких копий объекта (например, содержимого БД). Репликация — это процесс, под которым понимается копирование данных из одного источника на множество других и наоборот.
При репликации изменения, сделанные в одной копии объекта, могут быть распространены в другие копии.
Виды репликации
Репликация может быть синхронной или асинхронной, как описано ниже.
Синхронная репликация
В случае синхронной репликации, если данная реплика (копия данных) обновляется, все другие реплики того же фрагмента данных также должны быть обновлены в одной и той же транзакции. Логически это означает, что существует лишь одна версия данных.
В большинстве СУБД синхронная репликация реализуется с помощью триггерных процедур (возможно, скрытых и управляемых системой).
Недостаток: синхронная репликация создаёт дополнительную нагрузку при выполнении всех транзакций, в которых обновляются какие-либо реплики (также могут возникать проблемы, связанные с доступностью данных).