当前位置: 首页 > 知识库问答 >
问题:

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

贝礼骞
2023-03-14

我使用LiquiBase3.4.1和MySQL56并通过spring boot运行Liquibase。

我有一个变更集,其中包括向现有表中添加一列。新的column具有valuecomputed属性,并带有一个简单的select。

当我在该选择中出错时,变更集失败,迁移在该变更集停止。然而,新列被提交到数据库,但没有正确的值,而且,最糟糕的是,这个变更集没有标记为run!下一次运行迁移时,Liquibase再次尝试执行变更集,但失败了,因为列已经创建了。

变更集失败时,为什么Liquibase没有回滚事务?如何使变更集事务性化?

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

共有1个答案

仇航
2023-03-14

Liquibase尝试在事务中运行变更集,但我认为mysql会在ddl(添加列)之后提交:https://dev.mysql.com/doc/refman/5.5/en/implicit-committ.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命令执行。正确的方法是将它们移动到单独变更集中自己的update标记中。

 类似资料:
  • 我的问题是liquibase没有回滚我的一些变更集,这些变更集是在我试图回滚的变更集上设置标签后执行的。 例如,我创建了两个按正常方式执行的变更集(A和B)。然后,我创建了另一个变更集,它将变更集B的标记设置为Release1。并且这个变更集也按预期工作。但是,我随后执行另外5个变更集,所有变更集都使用回滚命令。而且这些也执行得很好。 现在,这个回滚不应该回滚在执行release1标记之后执行的任

  • 我有一个简单的liquibase变更集(下面),我正在尝试测试它。 这是应用程序启动后运行的第二个更改日志。 我故意编写了一个错误代码,其中我尝试创建列“new_2”两次,以强制回滚变更集中的所有条目:ADD_COL_2 然而,即使生成了回滚文件,并且我看到: 信息4/13/16 12:17 AM:LiquiBase:classpath:db/changelog/db.changelog-mult

  • case-0-3.sql: 我在进行任何更改之前标记数据库: 之后,我在每个文件应用后应用文件和标记数据库: 求求你,救命。可能有人在sql或其他格式中使用回滚操作?哪里错了?我做错了什么?它是工作液基功能吗?

  • 问题内容: 我正在使用MySQL的AUTO_INCREMENT字段和InnoDB支持事务。我回滚事务时注意到,AUTO_INCREMENT字段未回滚吗?我发现它是按这种方式设计的,但是有没有解决方法? 问题答案: 让我指出一些非常重要的事情: 您永远不要依赖自动生成键的数字功能。 也就是说,除了将它们的相等性(=)或不相等性(<>)进行比较之外,您不应做任何其他事情。没有关系运算符(<,>),没有

  • 假设我有一个包含3个变更集的changeLog文件。如果我从命令行运行Liquibase Update命令,但它在第二个变更集上失败,那么Liquibase会回滚到Update命令开始执行之前吗?还是保留变更集1中的变更?