PostgreSQL - ЗАМКИ

Блокировки или эксклюзивные блокировки или блокировки записи не позволяют пользователям изменять строку или всю таблицу. Строки, измененные с помощью UPDATE и DELETE, затем автоматически блокируются исключительно на время транзакции. Это предотвращает изменение строки другими пользователями до тех пор, пока транзакция не будет зафиксирована или откатится.

Единственный раз, когда пользователи должны ждать других пользователей, - это когда они пытаются изменить ту же строку. Если они изменяют разные строки, ждать не нужно. Запросы SELECT никогда не должны ждать.

База данных выполняет блокировку автоматически. Однако в некоторых случаях блокировкой необходимо управлять вручную. Ручная блокировка может быть выполнена с помощью команды LOCK. Он позволяет указать тип и объем блокировки транзакции.

Синтаксис команды LOCK

Основной синтаксис команды LOCK следующий:

LOCK [ TABLE ]
name
 IN
lock_mode
  • name- Имя (возможно, дополненное схемой) существующей таблицы для блокировки. Если перед именем таблицы указано ТОЛЬКО, блокируется только эта таблица. Если ONLY не указан, таблица и все ее дочерние таблицы (если есть) блокируются.

  • lock_mode- Режим блокировки указывает, с какими блокировками конфликтует эта блокировка. Если режим блокировки не указан, то используется ACCESS EXCLUSIVE, наиболее ограничительный режим. Возможные значения: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE.

После получения блокировка сохраняется до конца текущей транзакции. Нет команды UNLOCK TABLE; блокировки всегда снимаются в конце транзакции.

DeadLocks

Взаимоблокировки могут возникать, когда две транзакции ожидают завершения операций друг друга. Хотя PostgreSQL может их обнаруживать и завершать с помощью ROLLBACK, взаимоблокировки все же могут быть неудобными. Чтобы ваши приложения не столкнулись с этой проблемой, убедитесь, что они спроектированы таким образом, чтобы они блокировали объекты в том же порядке.

Консультативные блокировки

PostgreSQL предоставляет средства для создания блокировок, которые имеют значение, определяемое приложением. Это так называемые рекомендательные блокировки . Поскольку система не требует их использования, приложение должно использовать их правильно. Консультативные блокировки могут быть полезны для стратегий блокировки, которые не подходят для модели MVCC.

Например, обычно рекомендательные блокировки используются для имитации стратегий пессимистических блокировок, типичных для так называемых систем управления данными «плоских файлов». Хотя флаг, хранящийся в таблице, может использоваться для той же цели, рекомендательные блокировки выполняются быстрее, позволяют избежать раздувания таблицы и автоматически очищаются сервером в конце сеанса.

пример

Рассмотрим таблицу КОМПАНИЯ, имеющую следующие записи:

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;

Приведенный выше оператор PostgreSQL даст следующий результат:

LOCK TABLE

Приведенное выше сообщение указывает, что таблица заблокирована до завершения транзакции, и для завершения транзакции вам придется либо откатить, либо зафиксировать транзакцию.