私はDDLを発行するプログラムに取り組んでいます。 CREATE TABLE
および同様のDDLをロールバックできるかどうかを知りたい
各データベースがDDLでトランザクションを処理する方法を説明します。
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis は、PostgreSQLの観点からこの問題の概要を提供します。
このドキュメントによると、DDLはトランザクション対応ですか?
SQLiteにはトランザクションDDLもあるようです。 ROLLBACK
a CREATE TABLE
SQLiteのステートメント。そのCREATE TABLE
ドキュメントでは、特別なトランザクションの「落とし穴」については言及していません。
PostgreSQLは、ほとんどのデータベースオブジェクト(データベース、ユーザーではなく、テーブル、インデックスなど)に対してトランザクションDDLを持っています。ただし、実際にはすべてのDDLがACCESS EXCLUSIVE
ターゲットオブジェクトをロックし、DDLトランザクションが完了するまで完全にアクセスできないようにします。また、すべての状況が完全に処理されるわけではありません。たとえば、別のトランザクションがそれを削除し、置換テーブルfoo
を作成している間にテーブルfoo
から選択しようとすると、ブロックされたトランザクションは最終的に受信します新しいfoo
テーブルを見つけるのではなくエラー。 (編集:これはPostgreSQL 9.3以前で修正されました)
CREATE INDEX ... CONCURRENTLY
は例外です。3つのトランザクションを使用してインデックスをテーブルに追加し、同時に更新を許可するため、トランザクションでそれ自体を実行できません。
また、データベースメンテナンスコマンドVACUUM
はトランザクションで使用できません。
厳密に言うと「ロールバック」ではありませんが、OracleでFLASHBACKコマンドを使用して、これらのタイプの変更を元に戻すことができます(データベースがサポートされている場合)。
MySQLでできない
「InnoDBのCREATE TABLEステートメントは単一のトランザクションとして処理されます。つまり、ユーザーからのROLLBACKは、そのトランザクション中にユーザーが作成したCREATE TABLEステートメントを元に戻しません。」
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
いくつかの異なる方法を試してみましたが、単にロールバックしません。
回避策は、単純に失敗フラグを設定し、クエリの1つが失敗した場合に「drop table tblname」を実行することです。
他の答えはかなり時代遅れのようです。
2019年現在: