复盘工作2025-01

复盘工作2025-01-12

1.通过在A方法中创建新线程,新线程里调用(已定义为新开启事务的)B方法来实现B方法代码里能读到A方法里insert的数据:

/**
             * 1.问题:
             * 业务方法B里执行insert语句插入数据库设备表后,调用方法A,方法A里查视图(视图会查设备表)获取数据后生成二维码。
             * 但实际测试A方法里查视图无法查到新插入的设备,进而无法执行后续生成二维码逻辑。
             * 2.解决方案:
             * 在方法B中执行insert语句插入数据库设备表后,启动一个新线程,线程等待3秒后,调用方法A,同时将A方法定义为开启新的事务(
             * 这点通过给A方法加上@Transactional(propagation = Propagation.REQUIRES_NEW)来实现)。
             * 3.分析:
             * 3.1原方案失败原因:
             * (1)在默认情况下,spring中事务管理器(如DataSourceTransactionManager)使用数据库的事务隔离级别。
             * 大多数数据库默认使用“读已提交(read committed)隔离级别”。
             * (2)当方法A执行insert语句时,这条语句会开启一个事务,并且在这个事务提交之前,插入的数据对其他事务时不可见的。
             * 原来方法B里直接调方法A,由于B和A在同一个事务中运行(如果没有特别指定事务传播行为),
             * 执行方法A时,方法B的insert语句并没有提交,所以造成A方法里视图查设备表不到设备。
             * (3)默认情况下,如果方法在同一个事务上下文中被调用(即没有指定@Transactional的propagation属性),它们将共享同一个事务。
             * 3.2解决方案分析:
             * 将方法A加上注解@Transactional(propagation = Propagation.REQUIRES_NEW)注解后,该方法会在全新的事务中运行,
             * 与方法B所在事务是互不干扰的。同时在B方法启动新线程后延时3秒,有助于确保这时B方法的事务已提交
             * (即insert语句已提交)。从而使方法A里视图能查出刚入库的设备。
             */

复盘工作2025-01-13

1.通过在A方法中创建新线程,新线程里调用(已定义为新开启事务的)B方法来实现B方法代码里能读到A方法里insert的数据:代码复盘:

A方法:

// 在新线程里调用函数B时,给函数B传参时,参数必须是final
        // 否则会报错:Cannot refer to a non-final variable sbIdList
        // inside an inner class defined in a different method
        final String userName = CurUserUtil.getCurUser().getUserName();
        final String realName = CurUserUtil.getCurUser().getRealName();
        final ArrayList<String> sbIdList = new ArrayList<>();
        final ArrayList<String> dvAreaList = new ArrayList<>();

        sbIdList.add(id);
        dvAreaList.add(dvArea);

        if (!PmisCommonConstant.TZ_TREE_DVAREA_TXSB.equals(dvArea)) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    try {
                        pmSjbQrCodeService.genSwbmQrCode(sbIdList, dvAreaList, userName, realName);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

B方法:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void genSwbmQrCode(List<String> sbIdList, List<String> dvAreaList, String userName, String realName) throws Exception {
    // 具体业务逻辑省略
}

2.js根据','拆分字符串构成数组,并判断数组中是否含有'a'元素:

/**
   * js根据','拆分字符串构成数组,并判断数组中是否含有'a'元素
   */
  // 设备编号
  const sbbh = 'b,a,c';
  const arr = sbbh.split(',');
  // 经验证最后确实输出:字符串拆分后构成的数组中包含a
  if (arr.includes('a')) {
    alert('字符串拆分后构成的数组中包含a');
  } else {
    alert('字符串拆分后构成的数组中包含a');
  }

 

posted on 2025-01-12 22:15  平凡力量  阅读(27)  评论(0)    收藏  举报