PostgreSQL LOCK (Блокировка)
Блокировки в основном используются для поддержания согласованности данных базы данных. Они могут предотвратить изменение пользователями строки или всей таблицы и обычно применяются в базах данных с высоким уровнем параллелизма.
Когда несколько пользователей обращаются к базе данных, если параллельные операции не контролируются, могут быть прочитаны и сохранены неверные данные, что нарушит согласованность базы данных.
В базе данных существует два основных типа блокировок: эксклюзивные блокировки и разделяемые блокировки.Если на объект данных наложена эксклюзивная блокировка, другие транзакции не могут его читать или изменять.
Если добавлена разделяемая блокировка, объект базы данных может читаться другими транзакциями, но не может быть изменён.
Синтаксис команды LOCK
Базовый синтаксис команды LOCK выглядит следующим образом:
LOCK [ TABLE ] name IN lock_mode
- name: имя (при необходимости с квалификатором схемы) существующей таблицы, которую нужно заблокировать. Если перед именем таблицы указано ONLY, блокируется только эта таблица. Если ONLY не указано, блокируется таблица и все её дочерние таблицы (если есть).
- lock_mode: режим блокировки определяет, с какими блокировками конфликтует эта блокировка. Если режим блокировки не указан, используется самый строгий режим — ACCESS EXCLUSIVE. Возможные значения: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE.
После получения блокировка удерживается до конца текущей транзакции. Команды UNLOCK TABLE не существует; блокировки всегда снимаются при завершении транзакции.
Взаимоблокировка
Взаимоблокировка может возникнуть, когда две транзакции ждут завершения операций друг друга. Хотя PostgreSQL может обнаружить их и завершить откатом, взаимоблокировки всё равно очень неудобны. Чтобы ваше приложение не столкнулось с этой проблемой, убедитесь, что оно спроектировано так, чтобы блокировать объекты в одном и том же порядке.
Рекомендательные блокировки
PostgreSQL предоставляет способы создания блокировок с определяемым приложением смыслом. Они называются рекомендательными блокировками. Поскольку система не контролирует их использование, ответственность за корректное применение лежит на приложении. Рекомендательные блокировки полезны для стратегий блокировки, которые не укладываются в модель MVCC.
Например, рекомендательные блокировки часто используются для имитации стратегии пессимистической блокировки, типичной для так называемых «flat-file» систем управления данными. Хотя для этой же цели можно использовать флаги, хранящиеся в таблице, рекомендательные блокировки быстрее, не приводят к разбуханию таблицы и автоматически очищаются сервером в конце сеанса.
Примеры
Создайте таблицу COMPANY (Скачайте SQL-файл COMPANY), со следующими данными:
exampledb# select * from COMPANY; id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000 (7 rows)
В следующем примере таблица COMPANY в базе данных exampledb блокируется в режиме ACCESS EXCLUSIVE.
Инструкция LOCK работает только в режиме транзакции.
exampledb=#BEGIN; LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
Приведённая выше операция даст следующий результат:
LOCK TABLE
Приведённое выше сообщение указывает, что таблица заблокирована до конца транзакции, и для завершения транзакции необходимо откатить или зафиксировать транзакцию.
Другие расширения