美文网首页分布式
解决高并发环境下数据插入重复问题

解决高并发环境下数据插入重复问题

作者: 卓三阳 | 来源:发表于2020-03-21 21:50 被阅读0次

    背景描述

    应用框架:Spring Boot + mybatis
    数据库:Sqlserver
    系统一个业务号只允许存在一笔正在处理的预约订单,当多个用户同时发送多笔业务号相同的预约订单,我们发现数据库中也会存在多笔业务号相同的预约订单。。按照程序的编写逻辑,重复的数据应当是会被判断出来不被存储的。


    1.原因分析

    由于短时间内客户可能连续推送了两条重复的数据,两条数据时间间隔非常小,因此导致了我们的

    if(业务号存在){
       // ...
    }
    
    否则订单入库
    
    

    if 里面操作还没有执行完毕,第二条拥有相同数据的线程已经进入并通过了if的检验,导致数据库存储了两条相同的数据。


    2.解决方法

    (1)使用synchronized同步代码块即加同步锁
    synchronized(this){
       //...
    }
    

    这样会导致其他正常数据的推送线程也被阻塞,影响效率。因此不采用。我们考虑只对重复数据加锁。

    String lonNbr=... ;
    synchronized(lonNbr.intern()) {
        //...
    }   
    

    使用String作为同步锁必须注意产生不同对象的问题,必须保证线程拿到的是同一个String对象,但这个有时很难保证。这个时候就得使用intern()方法,这样就是直接获取的是字符串的值本身,而不是取的String的对象。
    Java中String做为synchronized同步锁使用详解

    这种加同步锁的方法在负载均衡下的多台应用服务器会失效!

    (2)分布式锁

    基于数据库实现分布式锁;(唯一索引,事务隔离级别,锁)
    基于缓存(Redis等)实现分布式锁;
    基于Zookeeper实现分布式锁;

    分布式锁简单入门以及三种实现方式介绍

    相关文章

      网友评论

        本文标题:解决高并发环境下数据插入重复问题

        本文链接:https://www.haomeiwen.com/subject/htouyhtx.html