我有多个应用程序服务器配置为在启动时运行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