数据字段保证唯一性

数据字段保证唯一性

我们日常开发中,常见这么一个需求,要求一个code,一个name,需要保证code不重复,而code是用户输入的,常见的就比如一些字典等。

这个的我们常见的几种做法的话。

唯一键

要么就是直接以code作为主键,这样的话,伪代码基本就是

  @Transactional(rollbackFor = Exception.class)public void add(String code,String name){try{mydao.insert(code,name);}catch (Exception e){throw myException("code不能重复")}}

基本就是以code为唯一键,当出入出现重复性错误的话,捕获后抛出自己封装的异常。

这个当然可以,但是如果不让你加唯一键的话,你怎么做。

先查后插

经常见的做法的话,就是

 @Transactional(rollbackFor = Exception.class)public void add(String code,String name){//操作1,先查询数据库有没有int count= mydao.select(code);if(count >0){throw myException("code不能重复");}//操作2,插入数据库mydao.insert(code,name);}

看似逻辑没问题,但是如果并发高点,就会导致数据库中存在两条以上code一样的数据。

可是为什么呢。

我们来模拟下,事务1和事务2同时执行,code是一致的。

这个时候,事务1的操作1执行,发现满足条件。

事务2的操作1也执行,因为事务1还没提交,自然也没查到数据,满足插入条件。

这个时候,事务1和事务2的操作2都可以插入,自然就插入两条code一致的数据,就满足不了唯一性了。

数据库锁

我们可以用数据库的锁来解决。

  @Transactional(rollbackFor = Exception.class)public void add(String code,String name){//操作1,先查询数据库有没有 //select code from mytable where code =code for updateint count= mydao.selectforupdate(code);if(count >0){throw myException("code不能重复");}//操作2,插入数据库mydao.insert(code,name);}

for update仅适用于InnoDB,且必须在事务块(BEGIN/COMMIT)中才能生效。在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞。排他锁包含行锁、表锁。

这个的话,就需要注意的是,查询走的是索引还是全表扫描,要将深入的话,基本要讲到索引加锁机制了,我们就简单理解为,如果code走的索引,就行锁,不走就全表。

这样事务1和事务2同时执行,事务1执行操作1,发现加锁成功,事务2执行操作1的时候,发现加锁失败,那事务2就挂起了,只能等事务1执行提交事务后才能成功。

这样就保证唯一性。

但是这个缺点比较大的是,因为code如果是数据库中没有的code,往往会导致加锁的范围比较大。导致接口并发比较低。

分布式锁

我们可以用分布式锁来代替数据库锁。

     @Transactional(rollbackFor = Exception.class)public void add(String code,String name){//操作1,用code加锁,用阻塞式加锁,5s后加锁还失败就返回失败boolean success = myLock.trylock(code,5);if(!success){throw myException("请重试");}try{//数据库查询codeint count =mydao.selectBycode(code);if(count >0){throw myException("code不能重复");}//操作2,插入数据库mydao.insert(code,name);}finally {myLock.unLock(code);}}

用分布式锁通过code加锁,这样的话,不同code的插入不影响,同一个code同时插入的时候,只会有一个插入code执行。

注意还是要数据库查一下,加锁只是保证没有多个同一个code同时插入。不能保证数据库就没有code。

还有就是分布式锁的基本操作,try{}包一下后最终解锁。

总结

简答的话,数据库的唯一索引就好。但是唯一的业务逻辑比较烦的时候,考虑一下分布式锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/84689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有了Spring为什么还需要SpringBoot呢

目录 一、Spring缺点分析 二、什么是Spring Boot 三、Spring Boot的核心功能 3.1 起步依赖 3.2 自动装配 一、Spring缺点分析 1. 配置文件和依赖太多了!!! spring是一个非常优秀的轻量级框架,以IOC(控制反转&…

URL与URI小结

文章目录 一、URL是什么?URL的一般形式: 二、分类三、URI总结 一、URL是什么? 每条由Web服务器返回的内容都是和它管理的某个文件相关联的,这些文件中的每一个都有一个唯一的名字,叫做URL(通用资源定位符&…

@DateTimeFormat 和 @JsonFormat 的详细研究

关于这两个时间转化注解,先说结论 一、介绍 1、DateTimeFormat DateTimeFormat 并不会根据得到其属性 pattern 把前端传入的数据转换成自己想要的格式,而是将前端的String类型数据封装到Date类型;其次它的 pattern 属性是用来规范前端传入…

java 自定义断言工具类

前言 java 开发过程中,应使用全局统一的断言工具类,使系统的断言处理一致,便于维护。 断言工具类 import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; impor…

python每日一题(模拟用户登录验证)

1、题目 预先设定正确用户名与密码,用来验证用户是否登录成功。 第一次: ① 输入用户名与密码,如果用户名与密码正确,则提示登录成功; ② 如果用户名错误(不管密码是否正确),则需要重…

TOGAF架构开发方法—初步阶段

本章描述了满足新企业体系结构业务指令所需的准备和启动活动,包括组织特定体系结构框架的定义和原则的定义。 一、目标 初步阶段的目标是: 确定组织所需的体系结构功能: 审查进行企业架构的组织背景确定受体系结构功能影响的企业组织的元素并确定其范围确定与架构功能相交的…

10分钟设置免费海外远程桌面

前言 本教程将向您介绍如何使用 Amazon Lightsail 服务的免费套餐轻松搭建属于您的远程桌面。依托于 Amazon 全球可用区,您可以在世界各地搭建符合您配置需求的远程桌面。 本教程需要先拥有亚马逊云科技海外账户。现在注册亚马逊云科技账户可以享受12个月免费套餐…

北工大汇编——综合题(2)

题目要求 编写一个比赛得分程序。共有7 个评委,按百分制打分,计分 原则是去掉一个最高分和一个最低分,求平均值。要求: 评委的打分以十进制从键盘输入。成绩以十进制给出,并保留 1位小数。输入输出时屏幕上要有相应提…

基于海康Ehome/ISUP接入到LiveNVR实现海康摄像头、录像机视频统一汇聚,做到物联网无插件直播回放和控制

LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB28181 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关…

代码随想录算法训练营第二天(C) | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵

文章目录 前言一、977.有序数组的平方二、209.长度最小的子数组三、59.螺旋矩阵总结 前言 java版: 代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵_愚者__的博客-CSDN博客 一、977.有序数组的平方 …

python实现命令tree的效果

把所有的文档都传到了git上,但是内容过多找起来不方便,突发奇想如果能在readme中,递归列出所有文件同时添加上对应的地址,这样只需要搜索到对应的文件点击就能跳转过去了… 列出文件总得有个显示格式,所以就按照tree的来了… 用python实现命令tree的效果 首先,这是tree的效果…

05预测识别-依托YOLO V8进行训练模型的识别——对视频中的图片进行识别

在前面的一些章节中,我们已经讲如何准备打标签的素材、如何制作标签、如何训练以及得到我们最终需要的用于YOLO目标识别的模型。那么现在我们就要正式开始,利用我们训练得到的best.pt,这个模型文件来对图片视频进行识别。 1、基本思路 公安交管场景中,我们经常会遇到需要…

坐标休斯顿,TDengine 受邀参与第九届石油天然气数字化大会

美国中部时间 9 月 14 日至 15 日,第九届石油天然气数字化大会在美国德克萨斯州-休斯顿-希尔顿美洲酒店举办。本次大会汇聚了数百名全球石油天然气技术高管及众多极具创新性的数据技术方案商,组织了上百场硬核演讲,技术专家与行业从业者共聚一…

C++ std::unique_lock 用法

文章目录 1.创建 std::unique_lock 对象2.自动加锁和解锁3.延迟加锁与手动加解锁4.尝试加锁5.配合条件变量使用6.小结参考文献 std::unique_lock 是 C11 提供的一个用于管理互斥锁的类,它提供了更灵活的锁管理功能,适用于各种多线程场景。 1.创建 std::u…

【unity小技巧】Unity 存储存档保存——PlayerPrefs、JsonUtility和MySQL数据库的使用

文章目录 前言PlayerPrefs一、基本介绍二、Demo三、优缺点 JsonUtility一、基本使用二、Demo三、优缺点 Mysql(扩展)完结 前言 游戏存档不言而喻,是游戏设计中的重要元素,可以提高游戏的可玩性,为玩家提供更多的自由和…

DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。

DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。 *.dem是一种比较常见的DEM数据格式,其有两种文件组织方式,即NSDTF-DEM和USGS-DEM。 (1)NSDT…

AAC算法

AAC(Advanced Audio Coding)是一种高级音频编码算法,用于对音频进行高效的压缩,并提供更好的音质。AAC算法是MPEG-2和MPEG-4标准中定义的音频编码格式之一。 以下是AAC算法的主要步骤: 分帧:将输入音频信号…

算法 括号生成-(递归回溯+同向双指针)

牛客网: BM60 N对括号的所有合法组合 解题思路: 使用双指针进行递归回溯获取所有可能组合,left指代"(",right指代")",均从0开始,left先行,left > right时,添加")"合法…

Dubbo3应用开发—Dubbo序列化方案(Kryo、FST、FASTJSON2、ProtoBuf序列化方案的介绍和使用)

Dubbo序列化方案(Kryo、FST、FASTJSON2、ProtoBuf序列化方案的介绍和使用) 序列化简介 序列化是Dubbo在RPC中非常重要的一个组成部分,其核心作用就是把网络传输中的数据,按照特定的格式进行传输。减小数据的体积,从而…

SSL双向认证-SpringBoot项目

SSL双向认证需要CA证书,开发过程可以利用自签CA证书进行调试验证。 自签CA证书生成过程:SSL双向认证-自签CA证书生成 1.将server.p12证书和client.jks证书复制到项目resources目录下 2.修改配置文件,增加下述内容 #https端口 server.port…