В HSQL для изменения CONTACTION CONTROL there can't be any active transactions. Flyway, в свою очередь, после переноса миграции X и до выполнения SQL из миграции X, устанавливает autocommitt = false и выполняет некоторые из своих собственных утверждений. Поэтому, если миграция содержит оператор SET DATABASE TRANSACTION CONTROL
, он будет ждать тех незафиксированных операторов, которые навсегда заставили приложение зависать.Управление транзакциями транзакций Changin DB в пролетном пути с hsql
(примечание к стороне). Операции, выполняемые пролетным путем перед переносом, варьируются от версии к версии, например, в 1.7, которые были чистыми выборами, поэтому изменение с LOCK на MVCC было возможным, но после того, как у меня были MVCC, любые последующие заявления DDL при последующих перемещениях flyway 2.0, он был выбран для обновления в таблице schema_version, поэтому любое изменение управления транзакцией было изменено, в 2.2 выбор для обновления был изменен на явный блокировку с тем же эффектом, что и в 2.0)
Таким образом, в принципе невозможно изменить управление транзакциями в миграция на пролет. С другой стороны, пролетной путь discourages changes outside of its migration. Любая идея, как изменить управление транзакциями с помощью flyway/hsql?
Обновление Другое наблюдение заключается в том, что, когда для элемента управления базой данных установлено значение MVCC, любая заявка DDL в миграции на лету также висит в приложении. Поэтому я бы просто установил LOCKS перед каждой миграцией и восстановил MVCC после него. Будет ли это чистое решение с точки зрения Flyway?
import com.googlecode.flyway.core.util.jdbc.JdbcUtils;
public void migrate() {
setDbTransactionControl("LOCKS");
flyway.migrate();
setDbTransactionControl("MVCC");
}
private void setDbTransactionControl(String mode) {
Connection connection = null;
try {
connection = JdbcUtils.openConnection(ds);
connection.createStatement().execute("SET DATABASE TRANSACTION CONTROL " + mode);
} catch (SQLException e) {
//log it
JdbcUtils.closeConnection(connection);
} finally {
JdbcUtils.closeConnection(connection);
}
}
Спасибо, я обновил вопрос с помощью примерного решения - как вы думаете, это правильно с точки зрения архитектуры Flyway? –