springboot3 liquibase SQL执行失败自动回滚,及自动打tag

文章介绍了如何使用Liquibase在SQL执行失败时自动执行回滚SQL,通过自定义监听器CustomChangeExecListener捕获异常并执行回滚,同时提到如何在SpringLiquibase中设置自动打tag以跟踪更改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一: 自动执行回滚, 已执行成功的忽略,新sql执行失败则执行新sql文件中的回滚sql

pom.xml 

<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.25.0</version>
</dependency>

sql 文件指定回滚sql

新建一个 CustomChangeExecListener 继承 AbstractChangeExecListener 

@Service
@Slf4j
public class CustomChangeExecListener extends AbstractChangeExecListener {

    @SneakyThrows
    public void runFailed(ChangeSet changeSet, DatabaseChangeLog databaseChangeLog, Database database, Exception exception) {
        log.error("sql执行失败, 执行回滚sql, 错误原因: {}", exception.getMessage());

        String line = "\r\n";

        String jdbc = "jdbc";

        List<String> sqlList = new ArrayList<>();
        changeSet.getRollback().getChanges().stream().forEach(e->{
            RawSQLChange rawSQLChange = (RawSQLChange) e;
            Arrays.asList(rawSQLChange.getSql().split(line)).stream().forEach(sql->{
                sqlList.add(sql);
            });
        });

       if(CollectionUtils.isEmpty(sqlList)){
            return;
        }

        Executor executor = Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor(jdbc, database);
        for (String sql : sqlList){
            executor.execute(new RawSqlStatement(sql));
        }

    }


}

启动参数加上:

-Dliquibase.command.changeExecListenerClass=com.tang.execListener.CustomChangeExecListener

2️⃣: 自动打tag, 注意如果有上面的自动执行回滚sql, 这一步不是很重要

spring.liquibase.tag 不起作用, 搞个自动打tag

1: github 拉取源码

地址:GitHub - liquibase/liquibase: Main Liquibase Source

2: idea 打开如下路径:

liquibase/sqlgenerator/core/MarkChangeSetRanGenerator.java 

加入如下代码:

  if(change instanceof RawSQLChange){
         tag = changeSet.getId();
  }

 

把编译的class 替换jar路径中的class放到仓库

sql文件中加入标记如下: 作者:id

加入上面的代码,tag会拿这个id 作为tag标签。

执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值