Подтвердить что ты не робот

Рабочий процесс транзакции DDL для MySQL

Я был немного удивлен, обнаружив, что операторы DDL (alter table, create index и т.д.) неявно фиксируют текущую транзакцию в MySQL. Исходя из MS SQL Server, возможность изменения базы данных в транзакции локально (которая была отброшена назад) была важной частью моего рабочего процесса. Для непрерывной интеграции откат использовался, если миграция была икрой по какой-либо причине, так что по крайней мере мы не оставили базу данных в состоянии с половиной миграции.

Как люди решают эти две проблемы при использовании MySQL с миграциями и непрерывной интеграцией?

4b9b3361

Ответ 1

Операторы DDL вызывают неявное коммитирование, и вы ничего не можете с этим поделать. Невозможно остановить это поведение.

У каких операторов DDL это поведение меняется со временем, поэтому вам нужно проверить свою версию.

5.1 http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html
5.5 http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html
5.6 http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html

Когда мы просто расширяем схему, новые таблицы/столбцы/представления/procs/etc, которые не будут влиять на существующий код, тогда автоматизация в порядке, просто проверьте наличие ошибок и исправьте их.

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

Поскольку это зависит от конкретного случая, я не могу предложить способ помощи для вашей конкретной ситуации.

Ответ 2

Одна из возможностей заключается в изменении DDL в неразрушающем режиме, который включает в себя:

  • разделить логику в DDL/DCL (+1 для отмены всех) и DML
  • запускать только добавленные столбцы DDL/DCL script, новые таблицы,..
  • в зависимости от результата:
    • при успешном выполнении, примените изменения DML,
    • on fail, применить обратный DDL/DCL script удалить материал, который вы хотите добавить на втором этапе (очевидно, с некоторыми ошибками "не существует", в зависимости от того, как прошел шаг 1)
  • удалить то, что больше не нужно, отбросить старые столбцы/таблицы