18

MySQL では、alter table/create table/etc などの ddl ステートメントが暗黙的なトランザクション コミットを引き起こすことを知っています。

PostgreSQL に移行しているため、複数の DDL ステートメントをトランザクションでラップすることは可能ですか?

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

4

2 に答える 2

22

DDL ステートメントは、トランザクションによってカバーされます。公式ドキュメントに関連するセクションが見つかりませんが、それをカバーする wiki へのリンクを提供しています。

トランザクションは postgresql では自動的に開かれないことに注意してください。BEGINまたはで開始する必要がありますSTART TRANSACTION

トランザクション DDL に関する Postgresql Wiki

于 2012-11-19T21:33:28.160 に答える
20

すべての Postgres DDL ステートメントをトランザクションでラップできるわけではありません。DROP DATABASE/などのステートメントDROP TABLESPACEや、その他のファイル システム関連のステートメントはロールバックできません。

また:

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

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

そのため、お使いのバージョンの postgres の公式マニュアルを読んで、DDL がトランザクション セーフかどうかを確認してください。

于 2012-11-19T21:54:00.913 に答える