...
- Явные транзакции. Каждый оператор выполняется в своей транзакции, если он не находится в блоке begin tran - commit (rollback)
- Наличие вложенных транзакций. Пример
Подтверждение вложенной транзакции ни на что не влияет. Откат вложенной транзакции откатывает самую внешнюю транзакцию.Блок кода sql sql begin tran ............ begin tran ................. commit (rollback) ................ commit (rollback)
- Операторы управления транзакциями
- SET TRANSACTION
- BEGIN TRANSACTION
- COMMIT, ROLLBACK
- SAVEPOINT
Понятие блокировок. Основные типы блокировок.
Блокировка - это механизм, используемый для управления одновременным доступом к общему ресурсу. Блокирование происходит, когда один сеанс удерживает ресурс, запрашиваемый другим сеансом. В результате запрашивающий сеанс будет заблокирован - он "повиснет" до тех пор, пока удерживающий сеанс не завершит работу с ресурсом.
Оптимистическое блокирование (optimistic locking) - стратегия блокирования набора данных, при которой раздел, содержащий изменяемую запись, блокируется только на время внесения изменений в запись программой, но не пользователем.
Пессимистическое блокирование (pessimistic locking) - стратегия блокирования набора данных, при которой раздел, содержащий изменяемую запись, блокируется на все время внесения изменений в запись пользователем и не доступна для редактирования другим пользователям.
Особенность механизма блокировок Oracle - блокировки данных не хранятся как отдельный ресурс, а содержатся непосредственно в блоках данных. Это позволяет избежать таких проблем, как эскалация блокировок. Ниже перечислены пять основных классов блокировок в Oracle. Первые три - общие (используются во всех базах данных Oracle), а две остальные — только в OPS (Oracle Parallel Server - параллельный сервер).
Блокировки ЯМД (DML locks). ЯМД означает язык манипулирования данными (Data Manipulation Language), то есть операторы SELECT, INSERT, UPDATE и DELETE. К блокировкам ЯМД относятся, например, блокировки строки данных или блокировка на уровне таблицы, затрагивающая все строки таблицы.
Блокировки ЯОД (DDL locks). ЯОД означает язык определения данных (Data Definition Language), то есть операторы CREATE, ALTER и так далее. Блокировки ЯОД защищают определения структур объектов.
Внутренние блокировки (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 varchar2(100), s_j varchar2(100)); |