首页 > 解决方案 > Liquibase 回滚在 Sprintboot 2.0 中不起作用

问题描述

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)
    );

标签: liquibaseliquibase-sql

解决方案


看起来你对它的用途有错误的认识rollback。它不是为了“在整个变更集中恢复一个大事务”。这是为了恢复一些过去的模式状态。

根据 Oracle文档

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

因此,在每条create table语句执行后,Oracle 都会提交事务。

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

看看这个线程

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

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

另外,查看这篇关于如何使用回滚的 liquibase-rollback文章。


推荐阅读