Mybatis在循环中获取序列值再启动事务后重复

  1. for (SysAttachment attachment : pactList){
  2. // 判断该附件是否已经传输过
  3. EntityWrapper<FixEquiPactLog> wrapper = new EntityWrapper<>();
  4. wrapper.eq("ATTACHMENT_ID",attachment.getId());
  5. List<FixEquiPactLog> selectList = fixEquiPactLogMapper.selectList(wrapper);
  6. if (selectList.size() != 0){
  7. continue;
  8. }
  9. FixEquiPactLog log = new FixEquiPactLog();
  10. log.setXh(fixEquiPactLogMapper.getNextVal());
  11. log.setBoeNo(boeNo);
  12. log.setAttachmentId(attachment.getId());
  13. EquiPayMain main = equiPayMainMapper.selectById(attachment.getBillId());
  14. log.setPaymentNo(main.getPayBillNo());
  15. log.setVendorCode(sysVendorMapper.selectById(main.getVenId()).getVenCode());
  16. log.setAttachmentType("purcPay".equals(attachment.getBillType()) ? 2 : 1);
  17. log.setContractCode(main.getContractNo());
  18. log.setFileName(attachment.getFilename());
  19. log.setFilePath(attachment.getFilePath());
  20. list.add(log);
  21. }

上述代码未开启事务注解@Transactional(_rollbackFor = Exception.class)_时正常获取序列值,开启后,获取序列值SQL只查询一次,并循环为每个实体赋值

解决方法

在mybatis的XML文件中关闭缓存

  1. <select id="getNextVal" resultType="java.lang.Long" useCache="false" flushCache="true">
  2. select S_FIX_EQUI_PACT_LOG.NEXTVAL from dual
  3. </select>