liquibase回滚是如何与springboot应用程序一起工作的?将非常感谢您的意见。
下面是我尝试过的内容--我在一个变更集中创建了TableA和TableB。
TableB已经存在于数据库中,我期望liquibase回滚TableA,因为在创建TableB时变更集失败,但liquibase创建TableA失败,并出现以下错误,并且从不执行回滚块,这很奇怪:
Caused by: liquibase.exception.DatabaseException: ORA-00955: name is already used by an existing objectLiquibase配置:
<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)
);发布于 2019-10-07 21:27:39
看起来你对rollback的用途有一个错误的认识。它是,而不是,意思是“在整个changeSet中恢复一个大事务”。它用于恢复一些过去的模式状态。
根据Oracle documentation
DDL数据库在任何数据定义语言(
)语句前后发出隐式COMMIT。
因此,在每次执行create table语句之后,Oracle都会提交事务。
如果错误发生在changeSet的执行过程中,liquibase只能回滚失败的事务。
查看此thread
如果出现错误,
Liquibase不会自动回滚在部署过程中所做的更改。相反,它可以在您要求时将数据库回滚到以前的模式状态。在某些情况下,它可以做到这一点,而无需您显式地说明如何执行回滚。
最好将Liquibase中的rollback命令视为“撤销部署”,而不是事务性回滚。
另外,请查看这篇关于如何使用回滚的liquibase-rollback文章。
https://stackoverflow.com/questions/58258170
复制相似问题