TRANSACTION CONTROL を変更する HSQL では、アクティブなトランザクションは存在できません。次に Flyway は、移行 X をコミットした後、移行 X から SQL を実行する前に、autocommitt=false を設定し、独自のステートメントのいくつかを実行します。したがって、移行にSET DATABASE TRANSACTION CONTROL
ステートメントが含まれている場合、コミットされていないステートメントを永久に待機し、アプリケーションをハングさせます。
(補足: 移行前に flyway によって実行されるステートメントはバージョンごとに異なります。たとえば、1.7 では純粋な選択であったため、LOCK から MVCC に変更することは可能でしたが、MVCC を使用した後、その後の移行で後続の DDL ステートメントがハングしました。flyway 2.0 ではそうでした。 schema_version テーブルで select for update を実行したため、トランザクション制御の変更がハングアップしました。2.2 では、select for update が明示的なロックに変更され、2.0 と同じ効果がありました)
したがって、基本的にフライウェイ移行でトランザクション制御を変更することはできません。一方、フライウェイは移行以外の変更を思いとどまらせます。flyway/hsqlでトランザクション制御を変更する方法はありますか?
更新 もう 1 つの観察結果は、データベース制御が MVCC に設定されている場合、フライウェイ移行の DDL ステートメントでもアプリケーションがハングすることです。したがって、各移行の前に LOCKS を設定し、移行後に MVCC を復元します。フライウェイの観点からは、それはクリーンなソリューションでしょうか?
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);
}
}