Можно ли откатить инструкции CREATE TABLE и ALTER TABLE в основных базах данных SQL?
Я работаю над программой, которая выдает DDL. Я хотел бы знать, если CREATE TABLE
и аналогичный DDL можно откатить в
- Postgres
- MySQL
- SQLite
- et al
опишите, как каждая база данных обрабатывает транзакции с DDL.
4 ответа:
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-да
- в DB2 - да
- в Informix - да
- Firebird (Interbase) - да
SQLite также, похоже,имеет транзакционный DDL. Я смог
ROLLBACK
aCREATE TABLE
оператор в SQLite. ЕгоCREATE TABLE
в документации не упоминается никаких специальных транзакций 'подводных камней'.
PostgreSQL имеет транзакционный DDL для большинства объектов базы данных (конечно, таблицы, индексы и т. д., но не базы данных, пользователи). Однако практически любой DDL получит
ACCESS EXCLUSIVE
блокировка целевого объекта, что делает его полностью недоступным до завершения транзакции DDL. Кроме того, не все ситуации вполне справляются - например, если вы пытаетесь выбрать из таблицыfoo
в то время как другая транзакция отбрасывает его и создает таблицу заменыfoo
, то заблокированная транзакция будет окончательно получите сообщение об ошибке вместо поиска новогоfoo
таблица. (Edit: это было исправлено в PostgreSQL 9.3 или до него)
CREATE INDEX ... CONCURRENTLY
является исключительным, он использует три транзакции для добавления индекса в таблицу, позволяя одновременные обновления, поэтому он не может быть выполнен в транзакции.также команда обслуживания базы данных
VACUUM
не может использоваться в транзакции.
хотя это, строго говоря, не" откат", в Oracle команда FLASHBACK может использоваться для отмены этих типов изменений, если база данных была настроена для ее поддержки.
не может быть сделано с помощью MySQL Кажется, очень глупо, но правда... (согласно принятому ответу)
"оператор CREATE TABLE в InnoDB обрабатывается как одна транзакция. Это означает, что откат от пользователя не отменяет инструкции CREATE TABLE, сделанные пользователем во время этой транзакции."
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
попробовал несколько разных способов, и он просто не будет катиться спина..
обойти - это просто установить флаг сбоя и сделать "drop table tblname", если один из запросов не удался..