Liquibase 不会使用 MySQL 回滚失败的变更集

Liquibase does not rollback failed changesets with MySQL

我正在通过 Spring Boot 将 Liquibase 3.4.1 与 MySQL56 和 运行 Liquibase 一起使用。

我有一个变更集,其中包括向现有 table 添加一列。新的 column 具有 valueComputed 属性和一个简单的 select。

当我在 select 中犯错时,变更集失败并且迁移在该变更集处停止。然而,新列已提交到数据库但没有正确的值,而且真正糟糕的是,此变更集未标记为 运行!下次我 运行 迁移 Liquibase 试图再次执行变更集,但失败了,因为该列已经创建。

为什么当变更集失败时 Liquibase 不回滚 t运行saction?我怎样才能使我的变更集 t运行有效?

编辑:显然,MySQL 在每个 DDL 命令之后提交。如果我在回滚标记中指定回滚命令,Liquibase 运行 然后 如果变更集失败 ?

Liquibase 尝试 运行 事务中的变更集,但我认为 mysql 在 ddl(添加的列)之后提交:https://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html

我不确定是否可以进行事务处理,但您可以将其拆分为两个变更集,如果列填充失败,它将被回滚,并且在重新 运行 之后您不会有问题(列已添加到先前的变更集中)。

Ilya Novoseltsev 编辑:

涉及 DDL 更改的变更集应该是原子的。

不好:

<changeSet author="novoseltsevib (generated)" id="1445871764871-19">
    <addColumn tableName="account_range">
        <column name="cash2card_participation" type="BIT(1)" valueBoolean="false"/>
    </addColumn>
    <addColumn tableName="account_range_aud">
        <column name="cash2card_participation" type="BIT(1)"/>
    </addColumn>
</changeSet>

好:

<changeSet author="novoseltsevib (generated)" id="1445871764871-19">
    <addColumn tableName="account_range">
        <column name="cash2card_participation" type="BIT(1)" valueBoolean="false"/>
    </addColumn>
</changeSet>
<changeSet author="novoseltsevib (generated)" id="1445871764871-20">
    <addColumn tableName="account_range_aud">
        <column name="cash2card_participation" type="BIT(1)"/>
    </addColumn>
</changeSet>

以这种方式编写变更集允许重复失败的变更集,而不必担心部分提交的变更。

使用value = ...时要小心,尤其是valueComputed。这些语句破坏了 addColumn 原子性。它们在 DDL 命令之后作为单独的更新命令执行。正确的方法是将它们移动到单独的变更集中它们自己的 update 标记。