2013-08-23 2 views
0

В 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); 
    } 
} 

ответ

0

Это невозможно во время миграции на пролет.

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

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

+0

Спасибо, я обновил вопрос с помощью примерного решения - как вы думаете, это правильно с точки зрения архитектуры Flyway? –

0

Попробуйте использовать Flyway callbacksbeforeMigrate и afterMigrate. Оба выполняются отдельно от транзакций миграции. MVCC должен использоваться для моего приложения, поэтому URL-адрес JDBC содержит hsqldb.tx=mvcc. Я мог бы успешно изменить модель транзакции во время миграции Flyway с beforeMigrate.sqlSET DATABASE TRANSACTION CONTROL LOCKS; и afterMigrate.sqlSET DATABASE TRANSACTION CONTROL MVCC;. Существуют также Java-версии обратных вызовов. Я использую HSQLDB 2.3.3 и Flyway 3.2.1.

Смежные вопросы