如何避免多线程导致的数据库重复数据问题

问题描述

用户数据保存数据库时,禁止保存重复数据。所以保存前先查询是否有相同数据,再进行保存。

然而还是有保存两条相同数据的问题。


原因分析:

经检查,目前只找到两个保存线程同时启动的情况下,即有一个线程还没执行完,另一个线程已经查询了显示没有重复数据时,会保存两条重复数据。
至于引起原因,目前只发现一次,不知道是不是网卡了,方法执行时间很短的,正常不会这样


解决方案:

虽然用户可能不多,但还是只给单用户上锁,不去影响其他用户

import java.util.concurrent.*

private final ConcurrentHashMap<Long, Lock> userLocks = new ConcurrentHashMap<>();
public Boolean test(User user) {
   
    Long userId = user.getUserId();
    // 获取用户特定的锁,如果该用户没有锁,则创建一个新的锁
    Lock userLock = userLocks.computeIfAbsent(userId, k -> new ReentrantLock());

    userLock.lock();// 获取用户特定的锁
      try {
    
      	//原方法
      } finally {
   
        userLock.unlock(); // 释放用户特定的锁
        userLocks.remove(userId);
    }
}

至于效果,额,谁知道呢,自己写个多线程测起码单用户是排队执行了

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2023-12-12 02:16:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-12 02:16:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-12 02:16:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-12 02:16:03       20 阅读

热门阅读

  1. 日常开发日志

    2023-12-12 02:16:03       41 阅读
  2. 使用boost::hana::maybe的示例程序

    2023-12-12 02:16:03       36 阅读
  3. numpy.repeat(重复维度数据)

    2023-12-12 02:16:03       49 阅读
  4. IDEA 报错

    2023-12-12 02:16:03       39 阅读
  5. openstack命令手册(T版)

    2023-12-12 02:16:03       36 阅读
  6. linux C++监听管道文件方式

    2023-12-12 02:16:03       33 阅读
  7. leetcode203. 移除链表元素

    2023-12-12 02:16:03       35 阅读
  8. PHP变量用{}的使用方法

    2023-12-12 02:16:03       42 阅读
  9. P5707 【深基2.例12】上学迟到题解

    2023-12-12 02:16:03       39 阅读
  10. 使用嵌入式高速计数器的示例:菱FX5U系列PLC

    2023-12-12 02:16:03       49 阅读