114

私はDDLを発行するプログラムに取り組んでいます。CREATE TABLE同様のDDLをロールバックできるかどうか知りたいのですが

  • Postgres
  • MySQL
  • SQLite
  • et al

各データベースがDDLを使用したトランザクションを処理する方法を説明します。

4

5 に答える 5

160

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysisは、PostgreSQLの観点からこの問題の概要を提供します。

このドキュメントによると、DDLはトランザクションですか?

  • PostgreSQL-はい
  • MySQL-いいえ; DDLは暗黙的なコミットを引き起こします
  • Oracle Database 11gリリース2以降-デフォルトではありませんが、エディションベースの再定義と呼ばれる代替手段が存在します
  • 古いバージョンのOracle-いいえ。DDLは暗黙的なコミットを引き起こします
  • SQLServer-はい
  • SybaseAdaptiveServer-はい
  • DB2-はい
  • Informix-はい
  • Firebird(Interbase)-はい

SQLiteにもトランザクションDDLがあるようです。SQLiteでステートメントを作成することができましROLLBACKた。CREATE TABLEそのCREATE TABLEドキュメントには、特別なトランザクションの「落とし穴」については触れられていません。

于 2011-01-19T14:26:42.057 に答える
32

PostgreSQLには、ほとんどのデータベースオブジェクト(確かにテーブル、インデックスなどがありますが、データベース、ユーザーはありません)のトランザクションDDLがあります。ただし、実際には、すべてのDDLはACCESS EXCLUSIVEターゲットオブジェクトをロックし、DDLトランザクションが終了するまで完全にアクセスできなくなります。fooまた、すべての状況が完全に処理されるわけではありません。たとえば、別のトランザクションがテーブルを削除して置換テーブルを作成しているときにテーブルから選択しようとすると、ブロックされたトランザクションは新しいテーブルfooを見つけるのではなく、最終的にエラーを受け取ります。foo(編集:これはPostgreSQL 9.3以前で修正されました)

CREATE INDEX ... CONCURRENTLY例外的です。3つのトランザクションを使用して、同時更新を許可しながらテーブルにインデックスを追加するため、トランザクション内でそれ自体を実行することはできません。

また、データベース保守コマンドVACUUMはトランザクションでは使用できません。

于 2011-01-14T16:07:11.413 に答える
8

MySQLでは実行できないようですが、非常に馬鹿げていますが、本当です...(受け入れられた回答によると)

「InnoDBのCREATETABLEステートメントは単一のトランザクションとして処理されます。これは、ユーザーからのROLLBACKが、そのトランザクション中にユーザーが作成したCREATETABLEステートメントを元に戻さないことを意味します。」

https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

いくつかの異なる方法を試しましたが、ロールバックしません。

回避策は、失敗フラグを設定し、クエリの1つが失敗した場合に「droptabletblname」を実行することです。

于 2017-11-14T21:35:24.127 に答える
4

厳密には「ロールバック」とは言えませんが、データベースがそれをサポートするように構成されている場合、OracleではFLASHBACKコマンドを使用してこれらのタイプの変更を元に戻すことができます。

于 2011-01-14T15:50:53.023 に答える
4

他の答えはかなり時代遅れのようです。

2019年現在:

  • Postgresは多くのリリースでトランザクションDDLをサポートしています。
  • SQLiteは、多くのリリースでトランザクションDDLをサポートしています。
  • MySQLは、8.0 (2018年にリリースされた)以降、AtomicDDLをサポートしています。
于 2019-06-24T14:02:18.167 に答える