【发布时间】:2012-12-04 13:15:34
【问题描述】:
我在一个带有 Spring 环境的项目中使用 Liquibase。但是回滚功能似乎不起作用。
我怀疑使用 Spring 运行 Liquibase 时不支持回滚功能,因为 the manual 说:
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,但是当它尝试创建另一个同名的表时它失败了(显然)。创建的表不会被删除,而是持久化到数据库中。
看着the Liquibase manual,我注意到:
runInTransaction
是否应该将 changeSet 作为单个事务运行(如果可能)?默认为真。 警告:小心使用此属性。如果设置为 false 并且在运行包含多个语句的 changeSet 的过程中发生错误,则 LiquiBase 数据库更改日志表将处于无效状态 自 1.9 起
我正在使用 MySQL,但更改集也必须与 MSSQL 和 Oracle 一起使用。
我也在使用 Spring 的事务,这些工作完美,有什么想法可以同时获得 Liquibase 的强大功能和那些很棒的(独立于数据库的)事务?
【问题讨论】:
标签: spring transactions rollback liquibase