Liquibase changesets выполняется только как одна транзакция
В дискуссии на форумах Liquibase разработчик Nathan Voxland говорит, что Liquibase должен фиксироваться после каждого изменения. Я знаю, что это семилетняя тема, поэтому с тех пор многое могло измениться, но, возможно, нет?
Он должен фиксироваться после любого изменения набора. В большинстве баз данных addColumn также автоматически фиксируется.
Документация для тега changeSet может быть интерпретирована как "зафиксированная после всех предварительных условий в журнале изменений успешно", что противоречит 7-летнему посту.
Liquibase пытается выполнить каждый набор изменений в транзакции, которая фиксируется в конце, или откатывается в случае ошибки. Некоторые базы данных будут автоматически фиксировать операторы, которые мешают этой настройке транзакции и могут привести к непредвиденному состоянию базы данных. Поэтому, как правило, лучше всего иметь только одно изменение на набор изменений, если только не существует группы изменений без автоматической фиксации, которые вы хотите применить в качестве транзакции, такой как вставка данных.
Liquibase все еще предназначен для фиксации после каждого изменения?
Я использую Liquibase 3.5.3 с Netbeans/Maven и запускаю обновление с помощью кода Java.
У меня есть один файл main_changelog, единственной целью которого является включение всех каталогов изменений в каталог. Два (пока) списка изменений в этом каталоге имеют по два набора изменений каждый. Каждый из двух журналов изменений имеет предварительное условие onFail="HALT" вне своих наборов изменений.
В моей тестовой среде есть предварительное условие для успешного изменения changelog_1 (поэтому все изменения в нем будут выполнены), а предварительное условие changelog_2 не выполняется.
В этой новой базе данных я вижу, что таблица DATABASECHANGELOG создается, но она пуста. Ни один из наборов изменений не зафиксирован, предположительно потому, что более позднее условие ОСТАНОВИТСЯ при неудаче. Я ожидал, что будут внесены все изменения до HALT.
Работаете как положено? Или ошибка?
1 ответ
Из документации по жидкой основе:
Предварительные условия на уровне журнала изменений применяются ко всем наборам изменений, а не только к тем, которые перечислены в текущем журнале изменений или его дочерних журналах изменений.
Поскольку ваше предварительное условие находится на уровне журнала изменений, и вы указали HALT, liquibase не применяет никаких наборов изменений. Транзакционность никогда не вступает в игру вообще.
Как упоминалось в документации, для каждого changeSet существует отдельная транзакция.
Liquibase пытается выполнить каждый набор изменений в транзакции...