我有一个简单的liquibase变更集(下面),我正在尝试测试 .
它是应用启动后运行的第二个更改日志 .
我编写了一个故意错误,我尝试创建两列“NEW_2”以强制回滚变更集中的所有条目:ADD_COL_2
但是,即使生成了回滚文件,我看到:
INFO 4/13/16 12:17 AM:liquibase:classpath:db / changelog / db.changelog-multi-set-then-rollback.xml:classpath:db / changelog / db.changelog-multi-set-then-rollback .xml :: ADD_COL_2 :: USER1:回滚变更集:类路径:db / changelog / db.changelog-multi-set-then-rollback.xml :: ADD_COL_2 :: USER1
INFO 4/13/16 12:17 AM:liquibase:classpath:db / changelog / db.changelog-multi-set-then-rollback.xml:classpath:db / changelog / db.changelog-multi-set-then-rollback .xml :: ADD_COL_1 :: USER1:回滚变更集:类路径:db / changelog / db.changelog-multi-set-then-rollback.xml :: ADD_COL_1 :: USER1
在日志中,仅回滚NEW_4和NEW_5列创建 .
ADD_COL_2更改日志不会出现在DATABASECHANGELOG中 .
ADD_COL_1更改日志在DATABASECHANGELOG中执行 .
为了测试回滚是否有效,我对TABLE_1执行Native查询,我可以看到NEW_1,2的值 . 我只希望看到NEW_1,因为NEW_2是失败的变更集的一部分?
如果我也查询INFORMATION_SCHEMA.TABLES,我会看到NEW_1和NEW_2 .
我已经尝试过没有回滚标记,每个语句的显式回滚标记,组标记的组合,但都无济于事 . 我试图将标签移动到自己的变更集 .
对我来说,似乎正在发生的事情是,所有对失败命令的更改都不会回滚 .
我需要手动拨打电话吗?我是否需要手动执行回滚文件,我是否误解了liquibase的工作方式,并且在失败时不会自动执行???
我真的在我的智慧结束,我(我想)我已经尽可能地运行每一个组合......我希望我做一些愚蠢的事情!
任何帮助都是无法估量的!
我正在使用Spring版本4.1.7,Liquibase 3.4.2并在Junit中运行测试 .
更改集:问题ADD_COL_2未完全回滚,NEW_2列仍保留在TABLE_1中
<changeSet id="ADD_COL_1" author="USER1" failOnError="true">
<comment>Add column NEW_1 to TABLE_1</comment>
<tagDatabase tag="ADD_COL_1"/>
<addColumn tableName="TABLE_1">
<column name="NEW_1" type="varchar(10)" value="NEW_1"/>
</addColumn>
</changeSet>
<changeSet id="ADD_COL_2" author="USER1" failOnError="true">
<tagDatabase tag="ADD_COL_2"/>
<comment>Add column NEW_2 to TABLE_1</comment>
<addColumn tableName="TABLE_1">
<column name="NEW_2" type="varchar(10)" value="NEW_2"/>
</addColumn>
<comment>Add column NEW_3 to TABLE_1</comment>
<addColumn tableName="TABLE_1">
<column name="NEW_2" type="varchar(10)" value="NEW_3"/>
</addColumn>
<comment>Add column NEW_4 to TABLE_1</comment>
<addColumn tableName="TABLE_1">
<column name="NEW_4" type="varchar(10)"/>
</addColumn>
<comment>Add column NEW_5 to TABLE_1</comment>
<addColumn tableName="TABLE_1">
<column name="NEW_5" type="varchar(10)"/>
</addColumn>
<rollback>
<dropColumn tableName="TABLE_1" columnName="NEW_2"/>
<dropColumn tableName="TABLE_1" columnName="NEW_3"/>
<dropColumn tableName="TABLE_1" columnName="NEW_4"/>
<dropColumn tableName="TABLE_1" columnName="NEW_5"/>
</rollback>
</changeSet>
**************** 附加信息 ****************
更新在我的应用程序内部运行,不运行外部liquibase命令 .
我的服务扩展了SpringLiquibase,并在设置属性后自动执行 .
1 回答
Liquibase不会运行任何
<rollback>
部分,直到你要求它(使用liquibase命令) . 它在事务中执行每个变更集,如果失败则尝试使用数据库事务引擎回滚此事务(这有一些限制,例如,如果在MySQL中添加列A并且在同一事务中无法添加列B之后,因为MySql在DDL语句之后提交,所以A不会回滚 .