PostgreSQL имеет транзакционный DDL для большинства объектов базы данных (конечно, таблиц, индексов и т. Д., Но не баз данных, пользователей).Однако практически любой DDL получит блокировку ACCESS EXCLUSIVE
на целевом объекте, что сделает его полностью недоступным до завершения транзакции DDL.Кроме того, не все ситуации обрабатываются достаточно точно - например, если вы попытаетесь выбрать из таблицы foo
, когда другая транзакция отбрасывает ее и создаст таблицу замены foo
, то заблокированная транзакция, наконец, получит ошибку, а не найдетновый foo
стол.(Изменить: это было исправлено в PostgreSQL 9.3 или ранее)
CREATE INDEX ... CONCURRENTLY
является исключительным, он использует три транзакции для добавления индекса в таблицу, одновременно допуская одновременные обновления, поэтому сам по себе не может быть выполнен в транзакции.
Также команда транзакции обслуживания базы данных VACUUM
не может использоваться в транзакции.