Я работаю над программой, которая выдает DDL. Я хотел бы знать, можно ли откатить CREATE TABLE
и аналогичный DDL в
- Postgres
- MySQL
- SQLite
- et al
Опишите, как каждая база данных обрабатывает транзакции с помощью DDL.
Я работаю над программой, которая выдает DDL. Я хотел бы знать, можно ли откатить CREATE TABLE
и аналогичный DDL в
Опишите, как каждая база данных обрабатывает транзакции с помощью DDL.
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis этот вопрос с точки зрения PostgreSQL.
Является ли DDL транзакционным согласно этому документу?
В SQLite также есть транзакционный DDL. Мне удалось ROLLBACK
выражение CREATE TABLE
в SQLite. В ее CREATE TABLE
документации не упоминаются какие-либо особые транзакционные "подводные камни".
ALTER TABLE
SQLite также можно откатить. Это не упоминается явно в документации. Там упоминается, как выполнять расширенные изменения внутри транзакции.
- person Thomas; 07.07.2017
PostgreSQL имеет транзакционный DDL для большинства объектов баз данных (конечно, таблиц, индексов и т. Д., Но не баз данных, пользователей). Однако практически любой DDL получит ACCESS EXCLUSIVE
блокировку на целевой объект, что сделает его полностью недоступным до завершения транзакции DDL. Кроме того, не все ситуации полностью обрабатываются - например, если вы попытаетесь выбрать из таблицы foo
, в то время как другая транзакция отбрасывает ее и создает таблицу замены foo
, тогда заблокированная транзакция, наконец, получит ошибку, а не найдет новую foo
таблицу. (Изменить: это было исправлено в PostgreSQL 9.3 или ранее)
CREATE INDEX ... CONCURRENTLY
является исключительным, он использует три транзакции для добавления индекса в таблицу, позволяя одновременные обновления, поэтому сам по себе он не может быть выполнен в транзакции.
Также в транзакции нельзя использовать команду обслуживания базы данных VACUUM
.
foo
, когда другая транзакция отбрасывает и воссоздает ее, то я принимаю старую версию или ошибку. Меня не устраивает новая версия, потому что она еще не зафиксирована, поэтому я не должен ее видеть. Я нормально отношусь к ошибке, потому что при параллельном транзакционном доступе нужно быть готовым к перезапуску транзакций в любом случае. Если ошибки случаются чаще, чем необходимо, это может снизить производительность, но это все равно верно.
- person Jan Hudec; 04.06.2014
Невозможно сделать с MySQL, кажется, очень глупо, но это правда ... (согласно принятому ответу)
«Оператор CREATE TABLE в InnoDB обрабатывается как одна транзакция. Это означает, что ROLLBACK от пользователя не отменяет операторы CREATE TABLE, сделанные пользователем во время этой транзакции».
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
Пробовал несколько разных способов и просто не откатывается ..
Чтобы решить эту проблему, просто установите флаг ошибки и выполните команду «drop table tblname», если один из запросов завершился неудачно.
Хотя это, строго говоря, не «откат», в Oracle команду FLASHBACK можно использовать для отмены этих типов изменений, если база данных была настроена для ее поддержки.
Похоже, другие ответы устарели.
As of 2019:
START TRANSACTION ... COMMIT;
. Таким образом, вы по-прежнему не можете откатить операторы DDL в транзакции, если последний в той же транзакции терпит неудачу. (См. Примечание в разделе dev.mysql.com/doc/refman /8.0/en/)
- person Lacek; 27.12.2019