我有多个应用程序服务器配置为在启动时运行 Flyway。每台服务器都尝试在同一 Oracle 11g 数据库中的多个架构中应用同一组迁移。这些服务器同时启动。这在大多数情况下都有效。然而,有时服务器会在迁移过程中失败,因为它遇到了唯一约束违规。
无法在元数据表“FOO”中插入版本“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)
...
我认为 Flyway 能够根据以下内容处理这种情况:
https://flywaydb.org/documentation/faq#parallel
flyway 实例不应该检测到架构版本表已锁定并移至下一个架构吗?
是否有一个设置可以确保架构版本被锁定,或者这是一个错误?
OracleTable 类以独占模式锁定表。是否应该添加 NOWAIT 子句并处理任何由此产生的 Oracle 异常?
最佳答案
它应该可以工作。我们在每次构建时都对此进行测试,并且没有NOWAIT 的行为就是我们想要的行为(阻塞直到锁被释放)。如果您可以可靠地重现此问题或在我们的代码中看到明显的错误,那么请务必在问题跟踪器中提交包含必要详细信息的错误。
关于java - Flyway 4.2.0 Oracle 11g 中多个节点并行故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45110617/