首页 > 编程语言 >java创建防重表防止数据重复提交

java创建防重表防止数据重复提交

时间:2023-07-07 15:13:51浏览次数:35  
标签:COMMENT product java name 商品 提交 防重表 id

加一张防重表,在防重表中增加商品表的name和model字段作为唯一索引。

例如:

CREATE TABLE `product_unique` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `name` varchar(130) DEFAULT NULL COMMENT '名称',
  `model` varchar(255)  NOT NULL COMMENT '规格',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '创建用户id',
  `user_name` varchar(30)  NOT NULL COMMENT '创建用户名称',
  `create_date` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_name_model` (`name`,`model`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品防重表';

其中表中的id可以用商品表的id,表中的name和model就是商品表的name和model,不过在这张防重表中增加了这两个字段的唯一索引。

 

视野一下子被打开了。

 

在添加商品数据之前,先添加防重表。如果添加成功,则说明可以正常添加商品,如果添加失败,则说明有重复数据。

 

防重表添加失败,后续的业务处理,要根据实际业务需求而定。

 

如果业务上允许添加一批商品时,发现有重复的,直接抛异常,则可以提示用户:系统检测到重复的商品,请刷新页面重试。

 

例如:

try {
  transactionTemplate.execute((status) -> {
      productUniqueMapper.batchInsert(productUniqueList);
      productMapper.batchInsert(productList);
  return Boolean.TRUE;
  });
} catch(DuplicateKeyException e) {
   throw new BusinessException("系统检测到重复的商品,请刷新页面重试");
}

在批量插入数据时,如果出现了重复数据,捕获DuplicateKeyException异常,转换成BusinessException这样运行时的业务异常。

 

还有一种业务场景,要求即使出现了重复的商品,也不抛异常,让业务流程也能够正常走下去。

 

例如:

try {
  transactionTemplate.execute((status) -> {
      productUniqueMapper.insert(productUnique);
      productMapper.insert(product);
  return Boolean.TRUE;
  });
} catch(DuplicateKeyException e) {
   product = productMapper.query(product);
}

  

在插入数据时,如果出现了重复数据,则捕获DuplicateKeyException,在catch代码块中再查询一次商品数据,将数据库已有的商品直接返回。

 

如果调用了同步添加商品的接口,这里非常关键的一点,是要返回已有数据的id,业务系统做后续操作,要拿这个id操作。

 

当然在执行execute之前,还是需要先查一下商品数据是否存在,如果已经存在,则直接返回已有数据,如果不存在,才执行execute方法。这一步千万不能少。

 

例如:

Product oldProduct = productMapper.query(product);
if(Objects.nonNull(oldProduct)) {
    return oldProduct;
}


try {
  transactionTemplate.execute((status) -> {
      productUniqueMapper.insert(productUnique);
      productMapper.insert(product);
  return Boolean.TRUE;
  });
} catch(DuplicateKeyException e) {
   product = productMapper.query(product);
}
return product;

千万注意:防重表和添加商品的操作必须要在同一个事务中,否则会出问题。

顺便说一下,还需要对商品的删除功能做特殊处理一下,在逻辑删除商品表的同时,要物理删除防重表。用商品表id作为查询条件即可。

标签:COMMENT,product,java,name,商品,提交,防重表,id
From: https://www.cnblogs.com/privateLogs/p/17534998.html

相关文章

  • JAVA设计模式之模板模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、......
  • 第一节 Java基础语法
    注意:​ 用记事本打开本文档,格式较差。​ 可安装typora软件后再次打开。​ 安装包位于:day01\资料\其他软件\阅读笔记的软件\typora-setup-x64.exeday01-Java基础语法1.人机交互1.1什么是cmd?就是在windows操作系统中,利用命令行的方式去操作计算机。我们可以利用cmd命令......
  • Java-基本语法回顾总结[109-126]
    怎么拆分微服务DDD领域驱动设计什么是中台项目怎么保证敏捷开发消息队列选型RocketMQ事务消息实现ZK为什么能作为注册中心RocketMQ底层实现原理消息队列如何保证可靠传输消息队列的作用死信队列和延时队列是什么如何保证消息的高速读写epoll和poll的......
  • Java中的多线程
    1.线程实现1.1线程创建(三种方法)Java下载图片的方法:通过FileUtils.copyURLToFile方法获取线程名字Thread.currentThread.getName()classWebDownloader{//下载方法publicvoiddownloader(Stringurl,Stringname){try{FileUtils.co......
  • Java true和false类型如何取反 这个问题怎么解决?
    Javatrue和false类型如何取反在Java中,true和false是布尔类型的取值。布尔类型只有两个取值:true和false。它通常用于判断和控制程序的流程。在某些情况下,我们需要对布尔类型进行取反操作。下面将介绍如何在Java中对布尔类型进行取反,并给出一个具体问题的解决方案。布尔类型的取反......
  • 如何实现Java postgresql 开启事务的具体操作步骤
    JavaPostgreSQL开启事务在Java应用程序中使用PostgreSQL数据库时,事务管理是一个非常重要的概念。事务是一组数据库操作的集合,要么全部成功,要么全部失败。通过使用事务,可以确保数据的一致性和完整性。本文将介绍如何在Java中使用PostgreSQL开启事务,并提供相应的代码示例。什么是......
  • 如何实现Java ora-01861:文字与格式字符串不匹配的具体操作步骤
    Java异常解析:ora-01861:文字与格式字符串不匹配当在Java程序中使用数据库操作时,可能会遇到ora-01861:文字与格式字符串不匹配异常。这个异常是由于将一个与格式化字符串不匹配的数据插入到数据库中引起的。在本文中,我们将详细介绍这个异常的原因、解决方法以及如何避免它的发......
  • 如何实现Java mqtt 客户端,收到自己发出消息的具体操作步骤
    实现JavaMQTT客户端收到自己发出的消息介绍在本文中,我将教会你如何使用Java实现一个MQTT(MessageQueuingTelemetryTransport)客户端,以接收自己发出的消息。MQTT是一个轻量级的消息协议,广泛应用于物联网和实时通信领域。我们将使用EclipsePaho库来实现这个功能。整体流程下面......
  • Java中NIO为什么需要buffer
    在Java的NIO(NewInput/Output)中,Buffer是一个关键概念,用于高效地处理数据。以下是一些JavaNIO中需要Buffer的原因:内存管理:Buffer提供了一种更有效的内存管理方式。它可以在堆内存或直接内存中创建一个固定大小的内存区域,用于暂存数据。这样可以避免频繁的内存分配和释放操作,提......
  • java 关于数据库外键
    查询性能:当查询涉及到外键关系时,数据库需要进行额外的操作来验证关联关系的完整性,这可能会导致查询速度变慢。特别是在大型数据库系统中,外键的验证操作可能会消耗较多的计算资源和时间。更新性能:当更新外键相关的数据时,数据库需要确保更新操作不会破坏关联关系的完整性。这可......