当前位置: 首页 > news >正文

在哪个网站做视频好赚钱网络营销企业网站优化

在哪个网站做视频好赚钱,网络营销企业网站优化,云南省住房城乡建设厅网站,杭州自适应网站建设文章目录1. 前言2. 问题描述3. 问题分析根本原因并发竞争逻辑问题重现模拟代码 1模拟代码 2---我自己遇到的问题触发条件4. 解决方案数据库层应用层代码改造示例 1代码改造示例 2 -- 我自己的解决方案5. 结束1. 前言 高并发场景下,数据库操作可能因线程竞争导致重复…

文章目录

  • 1. 前言
  • 2. 问题描述
  • 3. 问题分析
    • 根本原因
    • 并发竞争逻辑
    • 问题重现
      • 模拟代码 1
      • 模拟代码 2---我自己遇到的问题
      • 触发条件
  • 4. 解决方案
    • 数据库层
    • 应用层
      • 代码改造示例 1
      • 代码改造示例 2 -- 我自己的解决方案
  • 5. 结束

1. 前言

高并发场景下,数据库操作可能因线程竞争导致重复唯一键(DuplicateKey)异常。此类问题常出现在分布式系统或高流量业务中,需从代码、数据库、并发控制等多维度分析解决。

2. 问题描述

org.springframework.dao.DuplicateKeyException 是 Spring 对数据库唯一键冲突的封装异常,通常由以下操作触发:

  • 插入或更新数据时违反唯一约束(如主键、唯一索引)。
  • 并发请求同时插入相同唯一键值,数据库仅允许其中一个成功。

典型场景:用户注册时用户名唯一性检查与插入操作非原子性,导致多个线程同时通过检查后重复插入。

3. 问题分析

根本原因

  1. 非原子性操作:先查询后插入的分步操作,缺乏事务或锁保护。
  2. 数据库隔离级别不足:如使用 READ_COMMITTED 隔离级别,无法防止幻读。
  3. 唯一索引设计缺陷:未覆盖业务场景的全部约束条件。

并发竞争逻辑

Thread A → 检查key不存在 → 准备插入  
Thread B → 检查key不存在 → 插入成功  
Thread A → 插入失败(DuplicateKeyException)  

问题重现

模拟代码 1

@RestController
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public String register(String username) {// 高并发时多个线程可能同时通过检查if (!userService.existsByUsername(username)) {userService.save(new User(username));return "Success";}return "Username exists";}
}

模拟代码 2—我自己遇到的问题

@Overridepublic R isExistByFile(String fileName) {if (minioTemplate.isExist(fileProperties.getBucketName(),fileName)){//文件路径----字词卡片子卡片需要有唯一id标识if (fileName.contains("生成字词卡片音频")){HashMap<Object, Object> result;TeachExerciseFile exerciseFile = new TeachExerciseFile();exerciseFile.setPath(fileName);//文件名称exerciseFile.setName(fileName.substring(fileName.lastIndexOf("/"), fileName.lastIndexOf(".")));//文件后缀String extend = fileName.substring(fileName.lastIndexOf(".") + 1);exerciseFile.setExt(extend);teachExerciseFileMapper.insert(exerciseFile);result = new HashMap<>();result.put("file_id", exerciseFile.getId());result.put("file_url", exerciseFile.getPath());return R.ok().setCode(CommonConstants.SUCCESS).setData(result);}return R.ok().setCode(CommonConstants.SUCCESS).setData(fileName);}return R.ok().setCode(CommonConstants.FAIL);}

触发条件

  • 使用 JMeter 或 Postman 模拟 100+ 并发注册同一用户名。
  • 数据库日志显示多条 INSERT 语句尝试,最终抛出 DuplicateKeyException

4. 解决方案

数据库层

  • 唯一索引强制约束:确保表字段有唯一索引,如 ALTER TABLE users ADD UNIQUE (username)
  • ON DUPLICATE KEY UPDATE:MySQL 特有语法,冲突时转为更新。

应用层

  • 悲观锁:在查询前加锁(如 SELECT FOR UPDATE),但影响性能。
  • 乐观锁:通过版本号控制,但需重试机制。
  • 分布式锁:Redis 或 Zookeeper 实现互斥锁,确保唯一性检查与插入原子性。

代码改造示例 1

@Transactional
public String registerWithLock(String username) {// 先尝试插入,依赖数据库唯一索引try {userRepository.save(new User(username));return "Success";} catch (DuplicateKeyException e) {return "Username exists";}
}

代码改造示例 2 – 我自己的解决方案


// -----------------------------------修改点---定义一个 ReentrantLock 对象
private static final ReentrantLock insertLock = new ReentrantLock();
@Override
public R isExistByFile(String fileName) {if (minioTemplate.isExist(fileProperties.getBucketName(),fileName)){//文件路径----字词卡片子卡片需要有唯一id标识if (fileName.contains("生成字词卡片音频")){insertLock.lock();//----------------------修改点---加锁HashMap<Object, Object> result;try {TeachExerciseFile exerciseFile = new TeachExerciseFile();exerciseFile.setPath(fileName);//文件名称exerciseFile.setName(fileName.substring(fileName.lastIndexOf("/"), fileName.lastIndexOf(".")));//文件后缀String extend = fileName.substring(fileName.lastIndexOf(".") + 1);exerciseFile.setExt(extend);teachExerciseFileMapper.insert(exerciseFile);result = new HashMap<>();result.put("file_id", exerciseFile.getId());result.put("file_url", exerciseFile.getPath());} finally {insertLock.unlock(); //----------------------修改点---释放锁}return R.ok().setCode(CommonConstants.SUCCESS).setData(result);}return R.ok().setCode(CommonConstants.SUCCESS).setData(fileName);}return R.ok().setCode(CommonConstants.FAIL);
}

5. 结束

解决高并发重复键问题的核心在于 保证操作的原子性。优先通过数据库约束拦截冲突,结合业务场景选择锁机制或重试策略。实际开发中需权衡性能与一致性需求。
任何疑问,欢迎私信指教!!!
分享:
对付敌人我们需要很大的勇气,但在朋友面前坚定立场需要更大的勇气。——阿不思 邓布利多

http://www.dtcms.com/a/413250.html

相关文章:

  • 长春做网站的创建微信公众号教程
  • 建设银行网站怎么查流水费县建设局网站
  • 广汉做网站怀化同城网站
  • 咸鱼网站做链接域名管理
  • 搜索引擎优化特点网站优化公司开始上班了
  • 可以做自己的单机网站网站购买空间多少钱
  • 重庆最新消息今天seo在线培训机构
  • 盐城网站建设制作方案绵阳做手机网站建设
  • 安徽网站建设系统推荐好用的浏览器
  • 食堂网站建设一般的网站需要多大的空间
  • 新手做网站的几个必要步骤led论坛网站建设
  • 苏州网站建设系统找哪家百度域名查询
  • 网站服务器和直播服务器一样吗网站图片一般多大
  • 2015年做哪个网站致富项目建设的背景怎么写
  • vs215开发python网站开发做网站月入100万
  • 常州网站建设企业梧州论坛手机红豆网
  • 西部数码网站管理助手 mysql保存路径无锡本地网站
  • 律师网站专业设计网站开发描述
  • 做网站接电话一般要会什么问题wordpress 到小程序
  • 青岛网站关键词推广安装wordpress之后
  • 做游戏的网站有哪些内容网站未经授权推广别人的产品
  • 台州h5建站网站建设与管理专业课程
  • 门户网站的特点和优势江宁网站建设方案
  • 188旅游网站管理系统6.0模板wordpress 分类缩略图
  • 做网站需要绑定电脑ip吗深圳网站创建公司
  • 重庆建设信息网站查询企业策划书目录
  • 外贸网站索引页多网页制作与设计的英文
  • 农商网站建设个人总结动漫设计学什么
  • 杭州蒙特网站建设wordpress自动提交
  • 设计师接单的十个网站杭州制作网页公司