spring事务的问题,隔离级别设置成SERIALIZABLE还是会有重复数据

新手上路,请多包涵

我贴一下代码

@Transactional(isolation = Isolation.SERIALIZABLE)
    public String findCurrentBarcode(String unitsCode) {
        TCurrentBarcodeExample tCurrentBarcodeExample = new TCurrentBarcodeExample();
        tCurrentBarcodeExample.createCriteria().andCbUnitsCodeEqualTo(unitsCode);
        String allBarcode = "";
        String barcode = "";
        List<TCurrentBarcode> dataList = tCurrentBarcodeMapper.selectByExample(tCurrentBarcodeExample);
        logger.info("条码号:=====" + dataList.get(0).getCbCurrentNo());
        if (dataList.size() > 0) {
            TCurrentBarcode tCurrentBarcode = dataList.get(0);
            TCurrentBarcode tCurrentBarcodeNew = new TCurrentBarcode();
            tCurrentBarcodeNew.setCbId(tCurrentBarcode.getCbId());
            tCurrentBarcodeNew.setCbUnitsCode(tCurrentBarcode.getCbUnitsCode());
            barcode = tCurrentBarcode.getCbCurrentNo();
            allBarcode = prefixBarcode + barcode;
            while (true) {
                TRequestExample tRequestExample = new TRequestExample();
                tRequestExample.createCriteria().andRTestNoEqualTo(allBarcode);
                List<TRequest> requests = tRequestMapper.selectByExample(tRequestExample);
                if (requests.size() == 0) {
                    tCurrentBarcodeNew.setCbCurrentNo(String.valueOf(Long.valueOf(barcode) + 1));
                    tCurrentBarcodeMapper.updateByPrimaryKeySelective(tCurrentBarcodeNew);
                    return allBarcode;
                }
                barcode = String.valueOf(Long.valueOf(barcode) + 1);
                allBarcode = prefixBarcode + barcode;
            }
        } else {
            barcode = "9100000001";
            TCurrentBarcode tCurrentBarcodeNew = new TCurrentBarcode();
            long id = ibaseToolDao.getSequenceNextValue("SEQ_T_CURRENT_BARCODE");
            tCurrentBarcodeNew.setCbId(String.valueOf(id));
            tCurrentBarcodeNew.setCbUnitsCode(unitsCode);
            tCurrentBarcodeNew.setCbCurrentNo(String.valueOf(Long.valueOf(barcode) + 1));
            tCurrentBarcodeMapper.insert(tCurrentBarcodeNew);
            return prefixBarcode + barcode;
        }
    }

调用方是一个有锁的方法

private synchronized String getBarCode(String unitsCode){
        return iHisTestAppService.findCurrentBarcode(unitsCode);
    }

但是这样子写还是会有重复的条码号出来,一天了都没弄好,感觉快废了

阅读 1.9k
2 个回答

我觉得你可以先把你的业务逻辑说一下,光看代码不知道你要干什么,感觉可能是你业务代码写的有问题

看着没啥问题,不行试试数据库加唯一键试试,我感觉就是业务代码的问题,看着有锁有事务理论上应该不会