Можно ли откатить операторы CREATE TABLE и ALTER TABLE в основных базах данных SQL? - PullRequest
102 голосов
/ 14 января 2011

Я работаю над программой, которая выдает DDL.Я хотел бы знать, можно ли откатить CREATE TABLE и аналогичные DDL в

  • Postgres
  • MySQL
  • SQLite
  • и др.

Опишите, как каждая база данных обрабатывает транзакции с DDL.

Ответы [ 5 ]

135 голосов
/ 19 января 2011

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis содержит обзор этой проблемы с точки зрения PostgreSQL.

Является ли DDL транзакционным в соответствии с этим документом?

  • PostgreSQL - да
  • MySQL - нет; DDL вызывает неявную фиксацию
  • Oracle Database 11g Release 2 и выше - по умолчанию нет, но существует альтернатива, называемая переопределением на основе издания
  • Старые версии Oracle - нет; DDL вызывает неявную фиксацию
  • SQL Server - да
  • Sybase Adaptive Server - да
  • DB2 - да
  • Informix - да
  • Firebird (Interbase) - да

SQLite также имеет транзакционный DDL. Я был в состоянии ROLLBACK оператор CREATE TABLE в SQLite. Его CREATE TABLE документация не упоминает никаких специальных транзакционных «ошибок».

28 голосов
/ 14 января 2011

PostgreSQL имеет транзакционный DDL для большинства объектов базы данных (конечно, таблиц, индексов и т. Д., Но не баз данных, пользователей).Однако практически любой DDL получит блокировку ACCESS EXCLUSIVE на целевом объекте, что сделает его полностью недоступным до завершения транзакции DDL.Кроме того, не все ситуации обрабатываются достаточно точно - например, если вы попытаетесь выбрать из таблицы foo, когда другая транзакция отбрасывает ее и создаст таблицу замены foo, то заблокированная транзакция, наконец, получит ошибку, а не найдетновый foo стол.(Изменить: это было исправлено в PostgreSQL 9.3 или ранее)

CREATE INDEX ... CONCURRENTLY является исключительным, он использует три транзакции для добавления индекса в таблицу, одновременно допуская одновременные обновления, поэтому сам по себе не может быть выполнен в транзакции.

Также команда транзакции обслуживания базы данных VACUUM не может использоваться в транзакции.

4 голосов
/ 14 января 2011

Хотя это не является строго «откатом», в Oracle команду FLASHBACK можно использовать для отмены этих типов изменений, если база данных настроена для ее поддержки.

2 голосов
/ 15 ноября 2017

Не может быть сделано с MySQL , кажется, очень глупо, но верно ... (согласно принятому ответу)

"Оператор CREATE TABLE в InnoDBобрабатывается как одна транзакция. Это означает, что ROLLBACK от пользователя не отменяет операторы CREATE TABLE, сделанные пользователем во время этой транзакции. "

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

Попробовал несколькодругими способами, и он просто не откатится ..

Обходной путь - просто установить флаг сбоя и выполнить команду "drop table tblname", если один из запросов не удался ..

0 голосов
/ 24 июня 2019

Похоже, что другие ответы довольно устарели.

По состоянию на 2019 год:

  • Postgres поддерживает транзакционный DDL для многих выпусков.
  • SQLite поддерживает транзакционныйDDL для многих выпусков.
  • MySQL поддерживает Атомный DDL с 8.0 (выпущенный в 2018 году).
...