首页 > 其他分享 >多个线程下处理事务

多个线程下处理事务

时间:2023-01-30 17:11:40浏览次数:45  
标签:set MarketBankBusinessTrans 多个 线程 platformTransactionManager CountDownLatch new 

 

springboot项目都是声明式事务,在多个线程事务处理时,需要我们使用手动事务管理器

    @Resource
    private PlatformTransactionManager platformTransactionManager;
    @Resource
    private TransactionTemplate transactionTemplate;

这是是两个及以上线程协作,需要借助线程安全的工具,这里使用CountDownLatch处理线程间同步,使用CopyOnWriteArraySet 保存子线程运行的结果,然后由主线程决策子线程是否提交

 

     ExecutorService executor = Executors.newSingleThreadExecutor();
        CountDownLatch monitorLatch = new CountDownLatch(1);
        CountDownLatch subLatch = new CountDownLatch(1);
        CopyOnWriteArraySet<Boolean> resultSet = new CopyOnWriteArraySet<>();

        AtomicBoolean isSuc = new AtomicBoolean(false);

        executor.submit(()->{
            TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionTemplate);
            try{
                log.info("----------begin:开始操作-------");
                boolean update = marketBankBusinessTransService.lambdaUpdate().set(MarketBankBusinessTrans::getVerificationState, 0)
                        .eq(MarketBankBusinessTrans::getId, "1619265921141579778")
                        .update();

                resultSet.add(update);
                subLatch.countDown();

                monitorLatch.await();

                if(BooleanUtil.isFalse(isSuc.get())){
                    throw new RuntimeException("主线程决策为回滚---");
                }
                platformTransactionManager.commit(transactionStatus);
            } catch (Exception e){
                e.printStackTrace();
                subLatch.countDown();
                platformTransactionManager.rollback(transactionStatus);
            }
        });


        try {
            log.info("----------begin:开始操作-------");
            marketBankBusinessTransService.lambdaUpdate().set(MarketBankBusinessTrans::getVerificationState, 1)
                    .eq(MarketBankBusinessTrans::getId, "1619266976181047297")
                    .update();

            subLatch.await();
            if(resultSet.contains(true)){
                isSuc.set(true);
            }else {
                throw new RuntimeException("子线程执行错误,抛出异常,让主线程回滚");
            }
        } catch (Exception e){
            isSuc.set(false);
            throw new RuntimeException("主线程执行错误");
        } finally {
            monitorLatch.countDown();
        }

 

标签:set,MarketBankBusinessTrans,多个,线程,platformTransactionManager,CountDownLatch,new,
From: https://www.cnblogs.com/junnnnnnnn/p/17076672.html

相关文章

  • 使用Blender导出多个动画的GLTF模型
    准备工作:安装Blender准备好多套fbx格式的模型动画首先,加载进来模型。加载图片,将模型名称和动画名称都修改成相应的动作名称点击左下角按钮,切换到非线性动画在列表内会发现......
  • 多线程基础
    ThreadFactory线程工厂生产线程的工厂,newThread是生产线程的方法,可以定义线程的基本特性。(比如优先级、是否守护线程) join调用join方法就会优先执行这个线程(thread1),等......
  • Fitter-细节-过滤器拦截方式配置 Fitter-细节-过滤器链(多个过滤器)
    Fitter-细节-过滤器拦截方式配置  拦截方式配置:资源被访问的方式注解配置:设置dispatcherTypes属性1.REQUEST:默认值。浏览器直接请求资源......
  • c++线程池
    #pragmaonce#include<algorithm>#include<atomic>#include<condition_variable>#include<cstdint>#include<functional>#include<future>#include<map>#i......
  • 多线程基本概念
    什么是进程,线程?线程是进程的最小执行单元,相当于不同的执行路径run和start的区别?run只是单纯的方法调用,在主线程进行.start相当于开启一个线程线程的启动......
  • Jemeter模拟多个不同用户并发请求
    前言本文会略过jemeter的基础使用,比如请求的创建,运行。可以参考其他文章https://zhuanlan.zhihu.com/p/142897766我们对接口进行性能测试,经常会需要模拟多用户并发请......
  • 线程的生命周期,线程有几种状态
    线程的生命周期:创建-->就绪-->运行-->阻塞-->死亡线程的状态:新建状态(New):新创建了一个线程对象就绪状态(Runable):其它线程调用了该线程的start方法。该状态的线程都在......
  • 【博学谷学习记录】超强总结,用心分享 | 进程和线程的使用
    【博学谷IT技术支持】一、介绍进程:进程是资源分配最小单位;进程之间的资源是独立的;进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间;进程是可以并行执......
  • 多线程编程
    Java多线程编程Java给多线程编程提供了内置的支持。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任......
  • 【TS】泛型以及多个泛型参数
    泛型给函数或者属性定义类型的时候,类型是固定的,当业务发生变动时可能不好维护,例如:函数类型固定为string,后续需求更改不好维护,比如需要传入number类型,那么这个函数就不适......