Блокировка: механизм, используемый для одновременного доступа к общему ресурсу.
Блокировка:в разных СУБД, реализована по-разному.
Уровень блокировки: строка, таблица, блок (страница), схема, база данных, ...
Потерянные изменения:
- П1: выбирает строку;
- П2: вбирает ту же строку;
- П1: изменяет строку и фиксирует;
- П2: изменяет строку и фиксирует.
- П1: выбирает строку и не видит своего изменения.
Методы блокирования: пессимистическое, оптимистическое.
Оптимистическое блокирование:
Блокирование: INSERT, UPDATE, DELETE, SELECT FOR UPDATE [NOWAIT].
Блокирование INSERT: только если два пользователя одновременно добавляют строку с одинаковым PRIMARY KEY/UNIQUE ключом.
Блокирование UPDATE/DELETE:другой пользователь не зафиксировал (COMMIT) UPDATE/DELETE или выдал SELECT FOR UPDATE.
Взаимные блокировки:deadlock.
Эскалация блокировок:некоторые СУБД увеличивают уровень блокировки при многих малых. Oracle не выполняет эскалацию, но делает преобразование. Oracle: при выборе SELECT FOR UPDATE создаются две блокировки: EXCLUSIVE(эксклюзивная) на строку и ROW SHARE TABLE(разделяемая на таблицу).
Блокировки DML: TX-блокировки: начинаются с момента INSERT/UPDATE/DELETE/SELECT FOR UPDATE и заканчивается COMMIT/ROLLBACK. Хранится как атрибут данных (структура блока, слоты для транзакций, INITRANS=l/2 таблица/индекс, MAXTRANS<=255, 24 байта, позволяет избежать динамического выделения).
Информация о текущих блокировках: V$TRANSACTION, V$SESSION, V$LOCK
Блокировки DML: TM-блокировки очередности: устанавливается при DML-изменении, чтобы предотвратить DDL-изменения (ORA-00055).
Блокировки DDL:выполнение DDL всегда начитается с фиксации (COMMIT) транзакции, даже если сам DDL-оператор выполнен неудачно.
Защелки и блокировки с очередями:средства организации очередей к разделяемым ресурсам, защелка – очень непродолжительная блокировка (для защиты буферного кэша, библиотечного кэша); блокировки с очередями – медленнее защелок, но обеспечивает большие функциональные возможности.
Блокировка вручную: SELECT FOR UPDATE, LOCK TABLE IN EXCLUSIVE MODE – блокировка таблицы (не отменяет блокировку строк), используется при пакетном изменении данных, DBMS_LOCK(в основном для синхронизации работы с внешним ресурсом).
В Oracle нет оператора Начать транзакцию. Транзакция начинается неявно с INSERT, UPDATE, DELETE, SELECT FOR UPDATE.
Транзакция должна завершаться явно: COMMIT/ROLLBACK.
В триггере COMMIT/ROLLBACK в общем случае нельзя.
SAVEPOINT, ROLLBACK TO
SET TRANSACTION:уровни изолированности, только чтение.
Распределенные транзакции:DBLINK, двухфазная фиксация, 2PC-распределенный протокол, позволяющий фиксировать данные в нескольких базах данных.Координатор распределенной транзакции (одна из баз), COMMIT/ROLLBACK FORCE.
Автономные транзакции: в анонимных блоках, в процедурах и функциях, в методах объектных типов, триггерах. Нельзя использовать SAVEPOINT. Нельзя использовать в распределенных транзакциях. Таблицы TEMPORARY TABLE уровня транзакции можно использовать только в транзакции верхнего уровня.