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锁,换个角度考虑试试呢?
■网友
高并发尽量不要压到数据库里啊哥
推荐阅读
- 某些公司招聘要求中的精通mysql是啥程度
- |因玩游戏不写作业家长暴打孩子并发家长群,警方:已批评教育
- mysql myisam引擎,插入unique数据用不满cpu等硬件是啥原因
- 关于与高并发方面有啥影响大的论文,经典的图书可以看看
- 汽车|广汽本田首款纯电轿车EA6亮相车展,并发布车生活全价值战略
- 怎样对无线路由器进行全方位的性能测试,例如:并发数量,吞吐量,传输速率,稳定性等
- 就淘宝,京东而言,他们在网站架构上是怎样设计和实现的,各自的特点在那里(尤其是在数据的存储和并发访问上)
- 并发症|糖尿病血糖升高到多少,就会发生并发症?本文讲出实情
- 为啥mysql安装后,占磁盘空间比Oracle、SqlServer小这么多
- 糖尿病|糖尿病来临前,有4个明显症状,别等拖到并发症才知道,需了解
