ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-08-29 17:24:43  阅读:322  来源: 互联网

标签:mysql liquibase


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

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

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

当变更集失败时,为什么Liquibase不回滚事务?如何进行变更集事务处理?

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

解决方法:

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命令之后作为单独的更新命令执行.正确的方法是在单独的变更集中将它们移动到自己的更新标记中.

标签:mysql,liquibase
来源: https://codeday.me/bug/20190829/1762417.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有