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

时间:2015-10-27 10:49:26

标签: mysql liquibase

我正在使用Liquibase 3.4.1和MySQL56,并通过Spring Boot运行Liquibase。

我有一个变更集,包括向现有表添加列。新的column具有valueComputed属性,只需简单选择。

当我在选择错误时选择更改集失败并且迁移在该更改集停止时。但是新列被提交到数据库但是没有适当的值,而且真的很糟糕,这个变更集没有被标记为运行!下次我运行迁移时Liquibase尝试再次执行变更集,但由于已经创建了列而失败了。

为什么Liquibase在变更集失败时回滚交易?如何进行变更集事务?

编辑:显然,MySQL在每个DDL命令后提交。如果我在回滚标签中指定回滚命令,那么Liquibase会在变更集失败的情况下运行 吗?

1 个答案:

答案 0 :(得分:5)

Liquibase尝试在事务中运行changeset,但我认为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标记。