mysql高并发场景下重复插入怎样保证唯一性

最近做的存储系统元数据也有类似的需求,我们的做法是:按题主的情况举例,用户表以UID+Timestamp做主键或唯一索引,Timestamp为-1的表示当前有效的UID行,删除用户时把Timestamp由-1改为当前时间戳。
■网友
建议就是第一种办法第一种办法只需要插入一次 ,用唯一键来确保只有一条记录 程序只要判断是否插入成功即可第二站办法需要insert后再进行select,你这时候还需要考虑事物隔离级别 多麻烦 同时你insert了多条后 还需要后期考虑清理数据 也会导致数据库多浪费了资源
■网友
把重复的删掉,加唯一索引是正理
■网友
在MySQL的InnoDB引擎中解决这类问题至少有4种思路:
加唯一索引:有两种方案,一是新建表,而是改造表,目的都是能添加上唯一索引,由唯一索引来保证插入数据的唯一性,其中改造表方案比较优雅;
锁表:采用显式锁表和解锁表的语句LOCK TABLES和UNLOCK TABLES来保证并发重复数据插入的顺序性,从而保证插入数据的唯一性;
先检查再插入:主要利用MVCC + Nextkey锁来保证检查和插入加锁的关联来保证插入数据的唯一性;
采用insert ... select … 语句:利用insert ... select …原子执行的特点,再加上where子句实现了一种比较优雅的解决方案。
详细的分析见:https://blog.csdn.net/runhua/article/details/100058042

■网友
这个问题是比较蛋疼,其实无非是要保证同一个接口对同一个业务的幂等性,以下是我的几个方法:
【mysql高并发场景下重复插入怎样保证唯一性】 1. 把逻辑删除的数据移到另一张表,保证该表数据是唯一的,使用唯一索引---缺点数据库操作上太重,优点业务表功能简单数据“清爽”
2.使用分布式锁,用redis或zookeeper(推荐)实现分布式锁,每次要插入数据时先获取这么一个业务锁(粒度仅细到该条记录),获取到时先查询,有则你看着办,没有则插入,然后释放锁。因为该方法只是为了解决高并发的情况,所以锁的时间可以设置很短--缺点需要引入分布式中间件,优点性能不错,一劳永逸
3.查询-插入-查询-校正---缺点最笨的方法,优点最简单是最有效的

■网友
楼主隔离级别是什么?select...for update,查询时加X锁,换个角度考虑试试呢?
■网友
高并发尽量不要压到数据库里啊哥


    推荐阅读