账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    spring事务的问题,隔离级别设置成SERIALIZABLE还是会有重复数据
    71
    0
    我贴一下代码@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); }但是这样子写还是会有重复的条码号出来,一天了都没弄好,感觉快废了
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ╭ァ瑾色残年い 普通会员 1楼

      在Spring框架中,事务隔离级别(Transaction Isolation Level)主要分为以下几个级别:

      1. READ UNCOMMITTED (READ UNCOMMITTED):这个级别是最简单的隔离级别,表示事务处理过程中,所有的读操作都会被串行执行,即使两个读操作的执行结果相同,数据也不会被重复更新。这意味着读操作在读取数据库时不会影响到后续的写操作,数据的一致性高。

      2. READ COMMITTED (READ COMMITTED):这个级别也是最常见的隔离级别,它在读取数据库时会提交事务,如果读取操作没有遇到任何问题,那么事务就完成了。但是,如果在读取操作中发生了未处理的异常,那么事务可能会被回滚,这将导致数据的一致性降低,可能会出现重复数据的情况。

      3. SERIALIZABLE (SERIALIZABLE):这个级别表示事务处理过程中,所有的读操作和写操作都会被串行执行,即使两个读操作的执行结果相同,数据也不会被重复更新,但是写操作可能会被锁定,直到事务提交或者回滚。这样可以确保数据的一致性,避免了数据重复的情况。

      4.Repeatable Read (Repeatable Read):这个级别表示事务处理过程中,所有的读操作和写操作都会被串行执行,但是读操作的返回值可能会被多次使用,导致数据重复。然而,只有在事务提交或者回滚后,才会出现数据重复的情况。

      在实际应用中,为了保证数据的一致性,通常会将事务级别设置为SERIALIZABLE,这是因为Serializable隔离级别下的事务处理过程中的所有读操作和写操作都会被串行执行,保证了数据的一致性,避免了数据重复的问题。然而,如果需要提高数据的一致性,也可以在读取操作中进行一些判断和处理,如使用事务的rollbackBeforeRead和rollbackAfterWrite方法,或者在写操作中进行一些事务回滚操作,避免数据重复。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部