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
标记。
我正在通过 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
标记。