Поскольку вы только SELECT
, воздействие ограничено. Это более тяжело для любых операций записи, когда изменения не видны для какой-либо другой транзакции до тех пор, пока они не будут совершены, и потеряны, если они не будут совершены.
Это делает стоимость некоторых RAM и постоянно занимает один из ваших разрешенных соединений (которые могут иметь или не иметь значения).
Один из наиболее тяжелых последствий очень длительных транзакций: он блокирует VACUUM
от выполнения его работы, поскольку по-прежнему существует старая транзакция, которая может видеть старые строки. Система начнет раздуваться.
В частности, SELECT
приобретает блокировку ACCESS SHARE
(наименьшая блокировка всех) на всех ссылочных таблицах. Это не мешает другим DML команды, как INSERT
, UPDATE
или DELETE
, но это будет команды блок-DDL-, а также TRUNCATE
или VACUUM
(в том числе рабочих мест автовакуума). See "Table-level Locks" in the manual.
Он также может мешать различные репликации решений и привести к идентификатор транзакции оберточного в долгосрочной перспективе, если он остается открытым достаточно долго/вы сжигаете достаточно XIDs достаточно быстро. Подробнее об этом in the manual on "Routine Vacuuming".
Блокирующие эффекты могут быть заблокированы из-за того, что другие транзакции заблокированы и у них есть собственные замки. Etc.
Вы можете держать сделки открытыми (почти) на неопределенный срок - до тех пор, пока соединение не будет закрыто (., Который также происходит, когда сервер будет перезапущен, очевидно)
Но никогда не оставляйте сделки открытой дольше, чем это необходимо.
Удары: 1. Ваши данные не видны другим транзакциям 2.если вы в конечном итоге не совершаете - вы теряете свои данные. – zerkms
@zerkms Меня больше интересует влияние обработки на сервере: я понимаю, что любые внесенные изменения не будут видны другим соединениям (хотя в этом случае это только чтение данных, никогда не изменяющее ничего) – wolfcastle
Потеря данных не в конце концов, вы можете всегда использовать SAVEPOINTS. – Madthew