spring多线程事务控制

本测试多个子线程执行业务操作,我这只是简单的执行了批量添加,网上找了很多例子,杂七杂八的要么就是写的有bug要么就是运行结果不一致没效果,最后干脆自己写一个。
话不多说直接上代码
:


    @Autowired
    private PlatformTransactionManager transactionManager;

```/**
     * 将一组数据平均分成n组
     *
     * @param source 要分组的数据源
     * @param n      平均分成n组
     * @param <T>
     * @return
     */
    public static <T> List<List<T>> averageAssign(List<T> source, int n) {
        List<List<T>> result = new ArrayList<>();
        int remainder = source.size() % n;  //(先计算出余数)
        int number = source.size() / n;  //然后是商
        int offset = 0;//偏移量
        for (int i = 0; i < n; i++) {
            List<T> value = null;
            if (remainder > 0) {
                value = source.subList(i * number + offset, (i + 1) * number + offset + 1);
                remainder--;
                offset++;
            } else {
                value = source.subList(i * number + offset, (i + 1) * number + offset);
            }
            result.add(value);
        }
        return result;
    }
// 以上是工具类


    public void test() {
        Long startTime = System.currentTimeMillis();
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        // 获得事务状态
        TransactionStatus mainstatus = transactionManager.getTransaction(def);
        List<ZlTypeEntity> list = new ArrayList<>();
        ZlTypeEntity zlTypeEntity = null;
        for (int i = 0; i < 500000; i++) {
            zlTypeEntity = new ZlTypeEntity();
            zlTypeEntity.setName("测试" + i);
            list.add(zlTypeEntity);
        }
        //将list分成三组
        List<List<ZlTypeEntity>> listgp = ListFgUtils.averageAssign(list, 3);
       //定义子线程返回的结果集合如果全部为true则事务提交
        List<Boolean> bullist=Collections.synchronizedList(new ArrayList<>());
        //暂停当前线程
        CountDownLatch latch = new CountDownLatch(1);
        //线程计数器
        CountDownLatch cdAnswer = new CountDownLatch(2);
        for (int i = 0; i < 2; i++) {
            int finalI=i;
            ExecutorPoolUtil.fixedExecutorDiy.execute(new Runnable() {
                @Override
                public void run() {
                    AtomicInteger atomicInteger=new AtomicInteger();
                    atomicInteger.set(finalI+1);
                    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
                    // 事物隔离级别,开启新事务
                    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
                    // 获得事务状态
                    TransactionStatus status = transactionManager.getTransaction(def);
                    try {
                        //执行业务逻辑  子线程添加
                       AtomicBoolean a= new AtomicBoolean(saveBatch(listgp.get(atomicInteger.get())));
                       //计数
                        cdAnswer.countDown();
                       if(a.get()){
                           //添加
                           bullist.add(true);
                           //执行成功先暂停线程  等待其他线程执行结果
                           latch.await();
                           AtomicBoolean x=new AtomicBoolean(true);
                           for(int i=0;i<bullist.size();i++){
                              if(!bullist.get(i)){
                                  x.set(bullist.get(i));
                                  break;
                              }
                          }
                          if(x.get()){
                              transactionManager.commit(status);
                          }
                       }else{
                           bullist.add(false);
                       }
                    } catch (Exception e) {
                        //计数
                        cdAnswer.countDown();
                        //执行异常
                        bullist.add(false);
                        status.setRollbackOnly();
                    }
                }
            });
        }
        try{
            //等待全部线程都执行玩业务操作  (执行完后这时集合才会有全部的状态数据)
            cdAnswer.await();
            //放行 (执行全部子线程后面的代码)
            latch.countDown();
            //等待子线程执行完成(此时子线程如果状态集合都为true事务已经提交)
            latch.await();
   
            AtomicBoolean x=new AtomicBoolean(true);
          //主线程判断子线程时候有执行失败的
            for(int i=0;i<bullist.size();i++){
                if(!bullist.get(i)){
                    x.set(bullist.get(i));
                    break;
                }
            }
            //主线程添加
            saveBatch(listgp.get(0));
           
            if(x.get()){
      //没有则提交事务
                transactionManager.commit(mainstatus);
            }else{
                mainstatus.setRollbackOnly();
            }
        }catch (Exception e){
            mainstatus.setRollbackOnly();
        }
        System.out.println("耗时"+(System.currentTimeMillis()-startTime)+"ms");
    }



“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

qq_40133060

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值