【问题标题】:Liquibase transactions not working in Spring environmentLiquibase 事务在 Spring 环境中不起作用
【发布时间】: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


    【解决方案1】:

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

    对于回滚 n 更改等交互式步骤,您需要使用 CLI,或通过 Ant 或 Maven 构建脚本。

    后编辑

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

    【讨论】:

    • 我没有问对问题。我已经解决了这个问题,请查看我修改后的问题。
    【解决方案2】:

    根据文档,spring integration 似乎旨在支持数据库迁移。

    要执行回滚,您可以使用 liquibase jar,如下所示(参见 command-line docs):

    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 文件中获得。

    【讨论】:

    • 我没有问对问题。我已经解决了这个问题,请查看我修改后的问题。
    猜你喜欢
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2015-09-01
    • 2018-09-10
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多