2012-11-19 5 views
5

私は、alter table/create table/etcのようなMySQLのddl文が暗黙のトランザクションコミットを引き起こすことを知っています。PostgreSQLのトランザクションでDDLの変更をラップすることはできますか?

私たちはPostgreSQLに移行しているので、トランザクション内に複数のDDL文をラップすることは可能ですか?

これにより、移行スクリプトのロバスト性が向上し、DDLの変更が失敗するとすべてがロールバックされます。

答えて

10

DDL文はトランザクションによって処理されます。私は公式のドキュメントで関連するセクションを見つけることができませんが、それをカバーするwikiへのリンクを提供しました。

トランザクションは自動的にpostgresqlで開かれないので、BEGINまたはSTART TRANSACTIONで開始する必要があります。すべてのPostgresのDDL文がトランザクション内にラップすることができない

Postgresql Wiki about Transactional DDL

+5

マニュアルにトランザクションDDLに関する特別な章があるとは思わない。私が誤解されていない場合は、別段の記載がない限り、すべての声明をトランザクションとみなすことができます**。したがって、マニュアルはトランザクション以外のものだけを文書化するでしょう(例えば、 'create database') –

8

。ステートメントのようなDROP DATABASE/DROP TABLESPACEと他のファイルシステム関連のロールバックcant。

また:

ALTER TYPE ...(列挙 型に新しい値を追加フォーム)はトランザクションブロック内で実行することができない値を追加します。

また、TRUNCATEのようなステートメントは 'MVCC保存ではありません'です。そのようなステートメントによって行われた変更は、ロールバックされたとしても、他のクエリに影響する可能性があります。

あなたのDDLがトランザクションセーフであるかどうかを調べるには、あなたのバージョンのpostgresの公式マニュアルを読んでください。

+1

少なくともTRUNCATEの問題は、文書によると、9.2でも真です。 http://www.postgresql.org/docs/current/static/sql-truncate.html。 DBの作成/ドロップや 'TRUNCATE'を除いてほとんどすべてがトランザクションセーフです。 –

+1

そして 'DROP TABLESPACE'はどうですか?このhttp://stackoverflow.com/questions/1108749/limits-on-postgresql-schema-changes-inside-transactions?rq=1によると、安全ではない(または安全ではない)。 –

+0

重要な説明。 ISトランザクションを安全に切り捨て、MVCCには安全ではありません。 –

関連する問題