【问题标题】:Liquibase rollback not working in Sprintboot 2.0Liquibase 回滚在 Spring Boot 2.0 中不起作用
【发布时间】:2020-02-04 01:51:15
【问题描述】:

liquibase 回滚如何与 springboot 应用程序配合使用?非常感谢您的意见。

这是我尝试过的 - 我正在 Oracle 中的变更集中创建 TableA 和 TableB。

TableB 已经存在于数据库中,我希望 liquibase 回滚 TableA,因为在创建 TableB 时变更集失败,但 liquibase 创建 TableA 并失败并出现以下错误并且从不执​​行回滚块,这很奇怪:

Caused by: liquibase.exception.DatabaseException: ORA-00955: name is already used by an existing object

Liquibase 配置:

<changeSet id="rollback" author="test_user">
<validCheckSum>any</validCheckSum>

    <sqlFile path="db/changelog/changes/DML/ddl.sql"/>
    <sqlFile path="db/changelog/changes/DML/ddl.sql"/>

    <rollback> drop table TABLEA;</rollback>
    <rollback> drop table TABLEB;</rollback>
</changeSet>

ddl.sql

CREATE TABLE TABLEA
    (
        TEST_COL       VARCHAR2(100)
    );

    dml.sql 

    CREATE TABLE TABLEB
    (
        TEST_COL       VARCHAR2(100)
    );

【问题讨论】:

    标签: liquibase liquibase-sql


    【解决方案1】:

    您似乎对rollback 的用途有错误的认识。 不是“在整个变更集中恢复一个大事务”。这是为了恢复一些过去的架构状态。

    根据甲骨文documentation

    Oracle 数据库在任何数据之前和之后发出隐式 COMMIT 定义语言 (DDL) 语句。

    所以在每次create table 语句执行后,Oracle 都会提交事务。

    如果在 changeSet 执行期间发生错误,liquibase 只能回滚失败的事务,它会这样做。

    看看这个thread

    如果出现错误,Liquibase 不会自动回滚在部署期间所做的更改。相反,它可以在您要求时将数据库回滚到以前的模式状态。在某些情况下,它可以做到这一点,而无需您明确说明如何进行回滚。

    最好将 Liquibase 中的回滚命令视为 “撤消部署”而不是事务回滚。

    另外,请查看这篇 liquibase-rollback 文章,了解如何使用回滚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      相关资源
      最近更新 更多