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

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

PostgresMySQLSQLiteи другие

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

 araqnid14 янв. 2011 г., 17:07
сообщество вики?

Ответы на вопрос(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 Adaptive Server - даDB2 - даИнформикс - даFirebird (Interbase) - да

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

 Thomas07 июл. 2017 г., 16:41
Несколько ограниченныйALTER TABLE Оператор SQLite также можно откатить. Это явно не упоминается вдокументация, Здесь упоминается, как выполнить «расширенные» изменения внутри транзакции.
 joeforker30 апр. 2015 г., 20:42
Нет, кроме перечисленных, есть и другие базы данных SQL.
 Gili13 апр. 2017 г., 17:34
В MariaDB есть открытая проблема для добавления транзакционной поддержки DDL:jira.mariadb.org/browse/MDEV-4259, Пожалуйста, проголосуйте за это.
 joeforker17 сент. 2013 г., 20:57
Однако драйвер Python по умолчанию для sqlite предотвращает транзакционный SQL.bugs.python.org/issue10740
 rjmunro24 апр. 2015 г., 11:51
Поэтому ответ «Да, их можно откатить, если вы не используете MySQL или более старые версии Oracle».

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

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

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

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

Пробовал несколько разных способов, и он просто не откатится ..

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

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

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

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

 Dave Halter12 мар. 2013 г., 09:48
+1 заACCESS EXCLUSIVE Информация!
 Jan Hudec04 июн. 2014 г., 16:39
Я бы сказал, что если я попытаюсь выбрать из таблицыfoo в то время как другая транзакция сбрасывает и воссоздает ее, тогда я в порядке со старой версией или ошибкой. Я не согласен с новой версией, потому что она еще не была зафиксирована, поэтому я не должен ее видеть. Я в порядке с ошибкой, потому что в параллельном транзакционном доступе нужно быть готовым перезапустить транзакции так или иначе. Если ошибки происходят чаще, чем это необходимо, это может снизить производительность, но это все равно правильно.
 araqnid04 июн. 2014 г., 18:08
@JanHudec: вы не увидите незафиксированную версию новой таблицы, только результат всей транзакции, которая удалила / воссоздала ее. то есть транзакция, которая удаляет, воссоздает и заново заполняет таблицу, фактически является атомарной по сравнению с другими процессами, выбираемыми из этой таблицы. (но все будет заблокировано, как только они попытаются прочитать схему таблицы)

Ваш ответ на вопрос