Какой тип блокировки получает PostgreSQL при выполнении UPDATE? - PullRequest
0 голосов
/ 26 октября 2019

Мне известно, что у программистов есть возможность получить явные блокировки при выполнении операций с базой данных, но я хотел бы получить больше ясности в отношении того, какой тип блокировки Postgres получает (автоматически) при выполнении обычных операций, напримеркак UPDATE.

1 Ответ

1 голос
/ 26 октября 2019

Хорошо, давайте посмотрим и увидим.

Сначала откройте два соединения. В первом (заполните таблицу и т. Д. Значениями, соответствующими вашей БД):

=# BEGIN;
=# UPDATE table SET field = x WHERE id = y;

Теперь переключитесь на другое соединение. Используйте pg_stat_activity, чтобы найти pid для другого соединения:

=# SELECT pid FROM pg_stat_activity WHERE query = 'UPDATE table SET field = x WHERE id = y;';

 pid
------
 1684
(1 row)

Очевидно, что pid (идентификатор процесса) будет отличаться.

Хорошо, теперь используйте это pid чтобы узнать блокировки, которые находятся в игре:

=# SELECT * FROM pg_locks WHERE pid = 1684;
   locktype    | database | relation |  page  | tuple  | virtualxid | transactionid | classid | objid  | objsubid | virtualtransaction | pid |       mode       | granted | fastpath 
---------------+----------+----------+--------+--------+------------+---------------+---------+--------+----------+--------------------+-----+------------------+---------+----------
 relation      |    16384 |    16385 | [null] | [null] | [null]     |        [null] |  [null] | [null] |   [null] | 4/10730            | 743 | RowExclusiveLock | t       | t
 virtualxid    |   [null] |   [null] | [null] | [null] | 4/10730    |        [null] |  [null] | [null] |   [null] | 4/10730            | 743 | ExclusiveLock    | t       | t
 transactionid |   [null] |   [null] | [null] | [null] | [null]     |          1440 |  [null] | [null] |   [null] | 4/10730            | 743 | ExclusiveLock    | t       | f
(3 rows)

Теперь оба ExclusiveLock находятся в транзакции и виртуальной транзакции. Мы можем игнорировать их - они будут присутствовать практически во всех транзакциях, независимо от того, что они делают.

Но у RowExclusiveLock есть база данных и отношение, связанные с ней. Отношение - это таблица, которую вы обновляете.

Итак, правильный ответ на ваш вопрос: RowExclusiveLock.

Теперь вы можете ROLLBACK или COMMIT транзакцию обновления и очиститьвверх. Если вы хотите знать типы блокировки, используемые при SELECT FOR UPDATE, вы можете выполнить ту же процедуру.

Обратите внимание, что это самый простой случай: обновление одной строки одной таблицы. Более сложные обновления могут иметь больше блокировок, связанных с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...