2017-07-14 1 views
1

起動時にフライウェイを実行するように構成された複数のアプリケーション・サーバーがあります。各サーバーは、同じOracle 11gデータベース内の複数のスキーマに同じ移行セットを適用しようとします。これらのサーバーは同時に起動されます。これはほとんどの場合に有効です。ただし、ユニークな制約違反が発生するため、移行中にサーバーが失敗することがあります。メタデータテーブル "FOO" でフライウェイ4.2.0 Oracle 11gでパラレル・フェイルの複数ノード

バージョンの行を挿入することができません '0' "SCHEMA_VERSION"

SQL状態:23000 エラーコード:1 メッセージ:ORA-00001:一意制約(FOO.SCHEMA_VERSION_pk) ...

at org.flywaydb.core.internal.metadatatable.MetaDataTableImpl.addAppliedMigration(MetaDataTableImpl.java:242) 
    at org.flywaydb.core.internal.metadatatable.MetaDataTableImpl.addBaselineMarker(MetaDataTableImpl.java:334) 
    at org.flywaydb.core.internal.command.DbBaseline$2.call(DbBaseline.java:135) 
    at org.flywaydb.core.internal.command.DbBaseline$2.call(DbBaseline.java:112) 
    at org.flywaydb.core.internal.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:75) 
    at org.flywaydb.core.internal.command.DbBaseline.baseline(DbBaseline.java:112) 
    at org.flywaydb.core.Flyway$1.execute(Flyway.java:990) 
    at org.flywaydb.core.Flyway$1.execute(Flyway.java:971) 
    at org.flywaydb.core.Flyway.execute(Flyway.java:1464) 
    at org.flywaydb.core.Flyway.migrate(Flyway.java:971) 

に違反し、私はフライウェイには、以下に基づいて、このような状況に対処することができるだろうと考えた:

https://flywaydb.org/documentation/faq#parallel

flywayインスタンスがスキーマバージョンテーブルがロックされていることを検出して次のスキーマに移動しないでください。

スキーマのバージョンがロックされているかどうかを確認するための設定はありますか、これはバグですか?

OracleTableクラスは、排他モードで表をロックします。 NOWAIT句を追加し、結果のOracle例外を処理する必要がありますか?

答えて

0

正常に動作するはずです。私たちはすべてのビルドでこれをテストし、NOWAITなしの動作は私たちが望むものです(ロックが解除されるまでブロックします)。これを確実に再現したり、コードで明確な間違いが見つかった場合は、必ずIssue Trackerに必要な詳細を記載してください。

+0

私の場合、両方のflywayインスタンスが同じマイグレーションを実行しようとしています。最初のフライウェイがV1.0.0をスキーマFOOに移行する過程にある2番目のフライウェイを待っているとします。最初のフライウェイは、2番目の作業が終了してテーブルをロック解除してV1.0.0を移行しようとしているようで、ユニークな制約違反が発生します。通常と同じように移行する前に確認する必要があるようです。 – user581638