2017-07-14 55 views
1

我有多個應用程序服務器配置爲在啓動時運行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異常?

回答

0

它應該工作。我們用每一個構建來測試這個,沒有NOWAIT的行爲就是我們所期望的(阻塞直到鎖定被釋放)。如果您可以可靠地複製這些內容或在我們的代碼中看到明顯的錯誤,那麼請務必在問題跟蹤器中提供必要的詳細信息。

+0

在我的情況下,兩個flyway實例都試圖運行相同的遷移。假設第一條航道正在等待第二條航道,該航道正在將V1.0.0遷移到FOO架構。看起來第一個飛行路線在第二個完成後嘗試遷移V1.0.0,並已解鎖表格,導致違反唯一約束。看起來它應該在遷移之前進行檢查,正如通常那樣。 – user581638