美文网首页
Springboot在事务提交后回调执行代码-Transacti

Springboot在事务提交后回调执行代码-Transacti

作者: WebGis学习笔记 | 来源:发表于2022-08-16 14:34 被阅读0次

在开发过程中大家一定遇到过一种业务场景,需要在事务执行结束后再执行的代码逻辑,这个代码不受事务成败与否的影响,spring也为我们提供了这种功能那就是TransactionSynchronization。

为了方便使用我们直接封装成一个工具类,使用ThreadLoal对方法与线程进行绑定。

package com.casa.leetcode.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;

import java.util.LinkedList;
import java.util.List;
import java.util.Optional;


/**
 * 用于处理一些必须要等待事务提交后执行的操作
 *
 * save操作整个流程链
 * - 2022-08-16 10:04:15,586 [http-nio-8089-exec-1] ERROR c.c.l.u.TransactionLifeCycleUtils - TransactionLifeCycleUtils --- beforeCommit
 * - 2022-08-16 10:04:15,586 [http-nio-8089-exec-1] ERROR c.c.l.u.TransactionLifeCycleUtils - TransactionLifeCycleUtils --- beforeCompletion
 * - 2022-08-16 10:04:15,648 [http-nio-8089-exec-1] ERROR c.c.l.u.TransactionLifeCycleUtils - TransactionLifeCycleUtils --- afterCommit
 * - 2022-08-16 10:04:15,648 [http-nio-8089-exec-1] ERROR c.c.l.u.TransactionLifeCycleUtils - TransactionLifeCycleUtils --- afterCompletion --- 0
 *
 */
@Slf4j
public class TransactionLifeCycleUtils {


    private static ThreadLocal<List<Runnable>> threadLocalRunnableList = new ThreadLocal<>();

    private static TransactionSynchronization action = new TransactionSynchronization() {
        @Override
        public void afterCompletion(int status) {
            if (status == STATUS_COMMITTED) {
                List<Runnable> runnableList = threadLocalRunnableList.get();
                threadLocalRunnableList.remove();
                runnableList.forEach(Runnable::run);
            }
            TransactionSynchronization.super.afterCompletion(status);
        }
    };


    /**
     * 单例
     * @param command
     */
    public static void afterCommitSuccessCallback(Runnable command) {
        ThreadLocal<List<Runnable>> local = threadLocalRunnableList;

        Optional.ofNullable(local.get()).ifPresentOrElse(
                list -> list.add(command),
                () -> {
                    LinkedList<Runnable> list = new LinkedList<>();
                    list.add(command);
                    local.set(list);
                    TransactionSynchronizationManager.registerSynchronization(action);
                }
        );

    }


}

那我们如何使用呢

@Transactional
public Object save(SystemConfig config){
        TransactionLifeCycleUtils.afterCommitSuccessCallback(
            () -> log.info("save jpa success.")
        );
        return repository.saveAndFlush(config);
 }

再说说如果不使用TransactionSynchronization我们想在事务之外执行代码是怎么实现的。

public void saveConfig(SystemConfig config){
        this.save(config);
        //事务之外的逻辑
        log.info("save jpa success.")
}
@Transactional
public Object save(SystemConfig config){
        return repository.saveAndFlush(config);
 }

有问题欢迎讨论i❣

相关文章

  • Springboot在事务提交后回调执行代码-Transacti

    在开发过程中大家一定遇到过一种业务场景,需要在事务执行结束后再执行的代码逻辑,这个代码不受事务成败与否的影响,sp...

  • @Transactional+@Async期望异步方法在事务提交

    @Transactional 内部调用 @Async方法,期望异步方法再事务提交后执行,可以使用Transacti...

  • mysql事务隔离级别

    未提交读 A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚;---出现脏数据 已提交读 A事务执...

  • layui列表点击添加/编辑弹出框,ajax执行完毕layer.

    layui弹出框提交表单,不能用form标签,要提交的内容用 包裹,提交成功后执行layer.msg才会执行回调。

  • SpringBoot事务提交后执行后续操作

    SpringBoot事务提交后执行后续操作 业务场景 业务需求上经常会有一些边缘操作,比如主流程操作A:用户报名课...

  • Redis事务

    事务提供了一种"将多个命令打包,一次性提交并按顺序执行"的机制,提交后在事务执行中不会中断。只有在执行完所有命令后...

  • 手写源码(一):自己实现Spring事务

    手写Spring事务 Spring事务分为声明式事务(注解或包扫描)和编程式(在代码里提交或回滚)事务,声明式事务...

  • gorm-V2-08 事务

    1. 语法 开启事务 在事务中执行操作 从这里开始使用 'tx',而不是 'db' 400 回滚事务 提交这个事务...

  • JDBC事务提交/回滚实例

    JDBC事务提交/回滚实例 以下是使用事务教程中描述的提交和回滚的代码示例。 此示例代码是基于前面章节中完成的环境...

  • grom-事务

    1. 语法 开启事务 在事务中执行操作 从这里开始使用 'tx',而不是 'db' 回滚事务 提交这个事务 2. 示例

网友评论

      本文标题:Springboot在事务提交后回调执行代码-Transacti

      本文链接:https://www.haomeiwen.com/subject/zyprgrtx.html