数据库幻读解决方案
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了数据库幻读解决方案,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1779字,纯文字阅读大概需要3分钟。
内容图文
![数据库幻读解决方案](/upload/InfoBanner/zyjiaocheng/873/314fbdd83e30428fad6c28738f47e29e.jpg)
有时候我们会有业务场景去解决数据库幻读现象:(比如某条记录的某几个属性合起来需要在记录里唯一)
这个时候我们需要做的是添加一个校验字段对他做唯一约束,值是这几个字段的拼接
这里为什么用校验字段而不用原字段呢? (有时候我们在做删除的时候只做逻辑删除 这时候唯一约束就好导致失效的记录让有效的记录无法插入, 而校验字段不一样 你在做失效处理的时候给校验字段赋一个随机值就好了)
一般要解决幻读的场景我们都需要(不存在插入并且返回插入值 存在直接查询结果值)
以下是代码示例
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;
}
内容总结
以上是互联网集市为您收集整理的数据库幻读解决方案全部内容,希望文章能够帮你解决数据库幻读解决方案所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。