【问题标题】:Flyway: running multiple migrations in a single transactionFlyway:在单个事务中运行多个迁移
【发布时间】:2017-03-03 19:39:03
【问题描述】:

我一直将Flyway 视为数据库迁移工具。

我无法找到明确答案的一件事是:

我可以强制 Flyway 在单个事务中运行所有尚未应用的迁移,而不是让每个迁移成为自己的事务吗?

在开发环境中这不是问题,但在生产环境中,您可能会执行从一个更新到下一个更新的多次迁移,其中一个迁移失败会使数据库处于“半迁移”状态,其中有些迁移已提交,有些则未提交 - 很糟糕。

一种解决方法是简单地将所需的所有 SQL 塞进一个文件中,但这样做存在一些问题:

  • 生产迁移和开发迁移最终会以不同的方式执行,因为您无法提前知道开发环境中的迁移会发生什么。我想您总是可以先进行一次干净的迁移,然后再进行一次新的迁移,但这似乎与增量迁移方面的 flyway 设计精神背道而驰。

  • 添加新更改后校验和将有所不同。

Flyway 还不支持这样的功能吗?是 Liquibase 还是其他迁移工具?

【问题讨论】:

  • Liquibase 尝试运行事务中的每个 changeSet。可能您可以使用 updateSql 命令生成 sql 文件并对其进行后处理以设置所需的事务行为,然后使用某些工具应用它。可以为 dev/prod 实施此管道以避免特定于 prod 的问题。

标签: database-migration liquibase flyway


【解决方案1】:

没有开箱即用的此类功能。不过,这是一个很好的问题,我敢打赌,自从 Flyway 提供每次迁移的事务边界以来,人们就已经考虑过了——希望 Axel Fontaine 能够加入导致这不是一项功能的技术/设计考虑。

常见问题解答中有thisthis 来说明降级/故障。该政策归结为:

保持数据库和所有版本的向后兼容性 当前部署在生产中的代码....有一个很好的测试, 备份和恢复策略。

就我而言,我们已经使用 Flyway 将近 3 年了,并且遵守了引用的政策。在任何给定的部署中,我们可能会针对许多数据库运行 100 次或更多迁移,并且很高兴地说在生产中从未发生过任何不愉快的事情。这一切都归结为最大限度地减少发布过程中失败的机会。

在此之前,我在一个小得多的项目中使用过 Liquibase,除了提供回滚过程之外,我不记得有任何此类功能。

【讨论】:

    猜你喜欢
    • 2017-08-29
    • 2020-11-13
    • 2012-07-30
    • 2015-07-25
    • 2020-03-18
    • 2016-12-12
    • 2013-03-06
    • 2020-06-28
    • 2020-06-11
    相关资源
    最近更新 更多