Liquibase交易在Spring环境中不起作用



我在一个带有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

变更集是否应作为单个事务运行(如果可能)?默认为true警告:小心使用此属性。如果设置为false,并且在运行包含多个语句的changeSet的过程中出现错误,LiquiBase数据库changelog表将处于无效状态自1.9

我使用的是MySQL,但更改集也必须与MSSQL和Oracle一起使用。

我也在使用Spring的事务,这些事务非常完美,关于如何获得Liquibase的强大功能和那些强大的(独立于数据库的)事务,有什么想法吗?

据我回忆,spring集成是为了将数据库迁移作为后处理步骤。由于没有交互式步骤,您将没有机会指定命令,如"回滚一个变更集"。

对于滚动n-changes之类的交互式步骤,您需要使用CLI,或者通过Ant或Maven使用构建脚本。

后期编辑

事务级回滚取决于底层数据库实现。有些命令(如Oracle)不允许在事务回滚期间回滚DDL命令(如创建表)。我发现,对于这些情况,最好将每个DDL语句放在自己的变更集中,以防其中一个语句失败。事实上,如果对现有数据库运行generateChangeLog命令,您会发现Liquibase为每个DDL命令生成一个变更集。不过,对于其他类型的命令,如插入等,您仍然应该有事务级恢复。

根据doco,spring集成似乎是为支持数据库迁移而设计的。

要执行回滚,可以使用liquibase-jar如下(请参阅命令行文档):

java -jar liquibase.jar 
--driver=oracle.jdbc.OracleDriver 
--classpath=website.war 
--changeLogFile=com/example/db.changelog.xml 
--url=jdbc:oracle:thin:@localhost:1521:oracle 
--username=scott 
--password=tiger 
rollbackCount ?

数据库JDBC jar和更改日志都应该可以从WAR文件中获得。

最新更新