PostgreSQL - Блокировки
Блокировки не позволяют пользователям изменять строку или всю таблицу. Строки, измененные с помощью UPDATE и DELETE, автоматически блокируются исключительно на время транзакции. Это предотвращает изменение строки другими пользователями до тех пор, пока транзакция не будет подтверждена или отменена.
Единственный раз, когда пользователи должны ждать других пользователей, это когда они пытаются изменить одну и ту же строку. Если они изменяют разные строки, ожидание не требуется. Запросы SELECT никогда не должны ждать.
База данных выполняет блокировку автоматически. Однако в некоторых случаях блокировкой необходимо управлять вручную. Ручную блокировку можно выполнить с помощью команды LOCK. Это позволяет указать тип и область блокировки транзакции.
Синтаксис команды LOCK
Базовый синтаксис выглядит следующим образом:
LOCK [ TABLE ] name IN lock_mode
- имя — имя существующей таблицы для блокировки. Если 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 может обнаружить их и завершить с помощью ROLLBACK, тупиковые ситуации все же могут создавать неудобства. Чтобы не столкнуться с этой проблемой, спроектируйте свои операции таким образом, чтобы они блокировали объекты в одном и том же порядке.
Рекомендательные блокировки
PostgreSQL предоставляет средства для создания рекомендательных блокировок. Поскольку система не навязывает их использование, приложение должно отвечать за их правильное использование. Подобные блокировки могут быть полезны для стратегий блокировки, которые не подходят для механизма MVCC.
Например, рекомендательные блокировки обычно используются для имитации пессимистичных стратегий блокировки, типичных для так называемых «плоских файлов». Хотя флажок, хранящийся в таблице, можно использовать для той же цели, рекомендательные блокировки работают быстрее, позволяют избежать раздувания таблицы и автоматически очищаются сервером в конце сеанса.
Пример
Рассмотрим таблицу COMPANY:
testdb# 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 в базе данных testdb блокируется в режиме ACCESS EXCLUSIVE. Оператор LOCK работает только в режиме транзакции:
testdb=#BEGIN; LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
Результат будет следующим:
LOCK TABLE
Приведенное выше сообщение указывает, что таблица заблокирована до завершения транзакции, и для завершения транзакции Вам придется либо откатить ее, либо подтвердить.



