2017-07-14 186 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