Рабочий процесс транзакции DDL для MySQL
Я был немного удивлен, обнаружив, что операторы DDL (alter table
, create index
и т.д.) неявно фиксируют текущую транзакцию в MySQL. Исходя из MS SQL Server, возможность изменения базы данных в транзакции локально (которая была отброшена назад) была важной частью моего рабочего процесса. Для непрерывной интеграции откат использовался, если миграция была икрой по какой-либо причине, так что по крайней мере мы не оставили базу данных в состоянии с половиной миграции.
Как люди решают эти две проблемы при использовании MySQL с миграциями и непрерывной интеграцией?
Ответы
Ответ 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)
- удалить то, что больше не нужно, отбросить старые столбцы/таблицы