我有多個應用程序服務器配置爲在啓動時運行flyway。每臺服務器都嘗試在同一個Oracle 11g數據庫的多個模式中應用相同的一組遷移。這些服務器在同一時間啓動。這在大部分時間都適用。但是,有時候,服務器在遷移過程中會失敗,因爲它遇到了唯一的約束違規。Flyway 4.2.0使用Oracle 11g並行故障的多個節點
無法在元數據表 「foo」 的 「SCHEMA_VERSION」 來插入版本 '0' 行
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異常?
在我的情況下,兩個flyway實例都試圖運行相同的遷移。假設第一條航道正在等待第二條航道,該航道正在將V1.0.0遷移到FOO架構。看起來第一個飛行路線在第二個完成後嘗試遷移V1.0.0,並已解鎖表格,導致違反唯一約束。看起來它應該在遷移之前進行檢查,正如通常那樣。 – user581638