最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

数据库幻读解决方案

互联网 admin 4浏览 0评论

数据库幻读解决方案

有时候我们会有业务场景去解决数据库幻读现象:(比如某条记录的某几个属性合起来需要在记录里唯一) 

这个时候我们需要做的是添加一个校验字段对他做唯一约束,值是这几个字段的拼接

这里为什么用校验字段而不用原字段呢? (有时候我们在做删除的时候只做逻辑删除 这时候唯一约束就好导致失效的记录让有效的记录无法插入, 而校验字段不一样 你在做失效处理的时候给校验字段赋一个随机值就好了)

一般要解决幻读的场景我们都需要(不存在插入并且返回插入值 存在直接查询结果值)

以下是代码示例

 public ComArea findAreaOrAdd(String comCode, String name, String flag, boolean throwException) {if (name == null || name.equals("null")) {logger.error("插入失败 请检查name是否位空 areaId={}", name);throw new BaseRuntimeException("0x00110301", "更新失败 请检查name是否位空");}ComArea comArea = new ComArea();comArea.setComcode(comCode);comArea.setComAreaId(UUID.randomUUID().toString().replace("-", ""));comArea.setName(name);String comFlag = "1" + flag.substring(1, flag.length());comArea.setComFlag(comFlag);comArea.setFlag(flag);comArea.setValid("Y");comArea.setDateCreate(new Date());comArea.setDateModify(new Date());//因为幻读会导致生成重复的code code=>comcode+name md5生成的String code = DigestUtils.md5DigestAsHex((comCode + name).getBytes());comArea.setCode((comCode + code).substring(0, 32));//standardcode 做了唯一约束删除的时候要给standardcode一个随机值comArea.setStandardCode(comArea.getCode());ComArea comArea1 = null;try {comArea1 = comAreaService.save(comArea) ? comArea : null;} catch (Exception e) {if (throwException) {throw new BaseRuntimeException("0x00110301", "插入失败 请检查名称是否重复 [" + name + "]");} else {comArea1 = comAreaService.getOne(new QueryWrapper<ComArea>().lambda().eq(ComArea::getComcode, comCode).eq(ComArea::getName, name).eq(ComArea::getValid, "Y"), false);}}return comArea1;}

 

数据库幻读解决方案

有时候我们会有业务场景去解决数据库幻读现象:(比如某条记录的某几个属性合起来需要在记录里唯一) 

这个时候我们需要做的是添加一个校验字段对他做唯一约束,值是这几个字段的拼接

这里为什么用校验字段而不用原字段呢? (有时候我们在做删除的时候只做逻辑删除 这时候唯一约束就好导致失效的记录让有效的记录无法插入, 而校验字段不一样 你在做失效处理的时候给校验字段赋一个随机值就好了)

一般要解决幻读的场景我们都需要(不存在插入并且返回插入值 存在直接查询结果值)

以下是代码示例

 public ComArea findAreaOrAdd(String comCode, String name, String flag, boolean throwException) {if (name == null || name.equals("null")) {logger.error("插入失败 请检查name是否位空 areaId={}", name);throw new BaseRuntimeException("0x00110301", "更新失败 请检查name是否位空");}ComArea comArea = new ComArea();comArea.setComcode(comCode);comArea.setComAreaId(UUID.randomUUID().toString().replace("-", ""));comArea.setName(name);String comFlag = "1" + flag.substring(1, flag.length());comArea.setComFlag(comFlag);comArea.setFlag(flag);comArea.setValid("Y");comArea.setDateCreate(new Date());comArea.setDateModify(new Date());//因为幻读会导致生成重复的code code=>comcode+name md5生成的String code = DigestUtils.md5DigestAsHex((comCode + name).getBytes());comArea.setCode((comCode + code).substring(0, 32));//standardcode 做了唯一约束删除的时候要给standardcode一个随机值comArea.setStandardCode(comArea.getCode());ComArea comArea1 = null;try {comArea1 = comAreaService.save(comArea) ? comArea : null;} catch (Exception e) {if (throwException) {throw new BaseRuntimeException("0x00110301", "插入失败 请检查名称是否重复 [" + name + "]");} else {comArea1 = comAreaService.getOne(new QueryWrapper<ComArea>().lambda().eq(ComArea::getComcode, comCode).eq(ComArea::getName, name).eq(ComArea::getValid, "Y"), false);}}return comArea1;}

 

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论