Хорошо, давайте посмотрим и увидим.
Сначала откройте два соединения. В первом (заполните таблицу и т. Д. Значениями, соответствующими вашей БД):
=# 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
, вы можете выполнить ту же процедуру.
Обратите внимание, что это самый простой случай: обновление одной строки одной таблицы. Более сложные обновления могут иметь больше блокировок, связанных с ними.