2012-11-19 12 views
5

Wiem, że w instrukcjach ddl MySQL takich jak alter table/create table/etc powoduje niejawne zatwierdzenie transakcji.Czy można zawijać zmiany DDL w transakcji w PostgreSQL?

W miarę przechodzenia do PostgreSQL możliwe jest zawijanie wielu transakcji DDL w transakcji?

Spowoduje to, że skrypty migracji będą dużo bardziej odporne, a nieudana zmiana DDL spowoduje wycofanie wszystkich zmian.

Odpowiedz

10

Instrukcje DDL są objęte transakcjami. Nie mogę znaleźć odpowiedniej sekcji w oficjalnej dokumentacji, ale podałem link do wiki, która go obejmuje.

Pamiętaj tylko, że transakcje nie są otwierane automatycznie w postgresql, musisz je uruchomić pod BEGIN lub START TRANSACTION.

Postgresql Wiki about Transactional DDL

+5

Nie sądzę, że istnieje specjalny rozdział o transakcyjnym DDL w instrukcji. Jeśli się nie mylę, możesz założyć, że każde stwierdzenie jest transakcyjne **, chyba że ** podano inaczej. Tak więc instrukcja będzie dokumentować tylko te, które nie są transakcyjne (np. 'Utwórz bazę danych'). –

8

Nie każda wypowiedź PostgreSQL DDL może być zawinięte w transakcji. Oświadczenia takie jak DROP DATABASE/DROP TABLESPACE i niektóre inne wycofywanie przechyłki związane z systemem plików.

również:

ALTER TYPE ... wartość dodaną (forma, która dodaje nową wartość do wyliczenia typu) nie mogą być wykonywane wewnątrz bloku transakcji.

Również niektóre stwierdzenia, takie jak TRUNCATE, nie są "zapisaniem MVCC". Zmiany dokonywane za pomocą tego rodzaju instrukcji mogą wpływać na inne zapytania, nawet jeśli są wycofywane.

Więc - przeczytaj oficjalny podręcznik dla swojej wersji postgres, aby dowiedzieć się, czy twoje DDL są bezpieczne w transakcjach.

+1

Problem" TRUNCATE "pozostaje prawdziwy w 9.2, przynajmniej zgodnie z dokumentacją. http://www.postgresql.org/docs/current/static/sql-truncate.html. Niemal wszystko z wyjątkiem tworzenia/upuszczania bazy danych i 'TRUNCATE' jest bezpieczne dla transakcji. –

+1

A co z 'DROP TABLESPACE'? Zgodnie z tym http://stackoverflow.com/questions/1108749/limits-on-postgresql-schema-changes-inside-transactions?rq=1 nie jest bezpieczny (lub nie jest bezpieczny). –

+0

Ważne wyjaśnienie. skrócić bezpieczne transakcje IS, nie jest to bezpieczne dla MVCC. –