我在具有 Spring 环境的项目中使用 Liquibase。但是回滚功能似乎不起作用。
我怀疑使用 Spring 运行 Liquibase 时不支持回滚功能,因为手册说:
LiquiBase 允许您自动或通过自定义回滚 SQL 撤消对数据库所做的更改。回滚支持在命令行、Ant、Maven 和 Grails 中可用。
但是,很难相信在此设置中不可能进行回滚。所以问题是:“为什么回滚不起作用,我怎样才能让回滚起作用?”
编辑:
我现在意识到我应该问这个问题有点不同。我想要的回滚是在迁移时出现问题时发生的回滚。
我尝试使用事务(因为我假设这些事务在那里),但这并没有达到想要的效果。
将出错的更改集示例:
<changeSet runInTransaction="true">
<createTable tableName="table1">
<column name="a" type="int"/>
</createTable>
<createTable tableName="table1">
<column name="a" type="int"/>
</createTable>
<createTable tableName="table2">
<column name="a" type="int"/>
</createTable>
</changeSet>
当我运行示例更改集时,Liquibase 设法创建 table1 但是当它尝试创建另一个具有相同名称的表时它失败了(显然)。创建的表不会被删除,而是持久化到数据库中。
查看Liquibase 手册,我注意到:
runInTransaction
changeSet 是否应该作为单个事务运行(如果可能)?默认为真。警告:小心这个属性。如果设置为 false 并且在运行包含多个语句的 changeSet 的过程中发生错误,则 LiquiBase databasechangelog 表将处于无效状态 自 1.9
我正在使用 MySQL,但更改集也必须与 MSSQL 和 Oracle 一起使用。
我也在使用 Spring 的事务,并且这些工作完美,关于如何同时获得 Liquibase 的令人敬畏和那些令人敬畏的(数据库独立)事务的任何想法?