0

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

2 に答える 2

0

Flywayコールバック beforeMigrateおよびafterMigrateを使用してみてください。どちらも移行トランザクションとは別に実行されます。私のアプリケーションには MVCC を使用する必要があるため、JDBC URL にはhsqldb.tx=mvcc. Flyway の移行中にbeforeMigrate.sql SET DATABASE TRANSACTION CONTROL LOCKS;afterMigrate.sql を使用してトランザクション モデルを正常に変更できましSET DATABASE TRANSACTION CONTROL MVCC;た。コールバックの Java バージョンもあります。HSQLDB 2.3.3 と Flyway 3.2.1 を使用しています。

于 2016-09-01T14:54:46.197 に答える
0

これは Flyway 移行内では不可能です。

Flyway は移行を開始する前に、別の接続でトランザクションを開き、メタデータ テーブルのロックを取得します。したがって、他のトランザクションなしで絶対に実行する必要があるステートメントを実行することはできません。

おそらく最良のオプションは、データソースに設定することです。これにより、作成時にこの方法で各接続を開始できます。

于 2013-08-25T13:49:27.903 に答える