Я працюю над програмою, яка видає DDL. Мені хотілося б знати, чи можна CREATE TABLE
подібний DDL повернути назад
- Постгрес
- MySQL
- SQLite
- та ін
Опишіть, як кожна база даних обробляє транзакції з 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 також може бути відхилена назад. Це прямо не зазначено в документації . Там згадується, як здійснити "розширені" зміни всередині транзакції.
PostgreSQL має транзакційний DDL для більшості об'єктів бази даних (звичайно, таблиці, індекси тощо, але не бази даних, користувачі). Однак практично будь-який DDL отримає ACCESS EXCLUSIVE
блокування на цільовому об'єкті, що зробить його повністю недоступним до завершення транзакції DDL. Крім того, не всі ситуації цілком обробляються - наприклад, якщо ви намагаєтесь вибрати з таблиці, foo
коли інша транзакція скидає її та створює таблицю заміни foo
, тоді заблокована транзакція нарешті отримає помилку, а не знаходить нову foo
таблицю. (Редагувати: це було виправлено в або раніше PostgreSQL 9.3)
CREATE INDEX ... CONCURRENTLY
є винятковою, він використовує три транзакції для додавання індексу до таблиці, дозволяючи одночасне оновлення, тому він не може сам виконуватись в транзакції.
Також команда обслуговування бази даних VACUUM
не може використовуватися для транзакції.
foo
коли інша транзакція скидає та відтворює її, то я добре зі старою версією або помилкою. З новою версією я не в порядку, тому що вона ще не була зроблена, тому я не повинен її бачити. Я все в порядку з помилкою, тому що при одночасному транзакційному доступі потрібно бути готовим до перезапуску транзакцій у будь-якому випадку. Якщо помилки трапляються частіше, ніж потрібно, це може знизити продуктивність, але це все-таки правильно.
Хоча це не суворо кажучи про "відкат", в Oracle команда FLASHBACK може використовуватися для скасування цих типів змін, якщо база даних налаштована для її підтримки.
Схоже, інші відповіді досить застаріли.
Станом на 2019 рік:
START TRANSACTION ... COMMIT;
тому ви все ще не можете повернути оператори DDL в транзакції, якщо останній в тій же транзакції виходить з ладу. (Див. Примітку під розд. mysql.com/doc/refman/8.0/en/… )
Неможливо зробити це з MySQL, здається, дуже німим, але правдою ... (відповідно до прийнятої відповіді)
"Оператор CREATE TABLE в InnoDB обробляється як одна операція. Це означає, що ROLLBACK від користувача не скасовує CREATE TABLE заяви, які користувач робив під час цієї транзакції."
https://dev.mysql.com/doc/refman/5.7/uk/implicit-commit.html
Спробував декілька різних способів, і він просто не відкатиться ..
Якщо вам не вдалося один із запитів, просто встановіть прапор відмови та зробіть "скидання tblname таблиці".