并发insert情况下会发生重复的数据插入问题
来源:互联网 发布:js done方法 编辑:程序博客网 时间:2024/05/29 05:08
并发insert情况下会发生重复的数据插入问题
1.背景
用多线程接收推送的订单数据,把接收的订单数据存到一个表中,实现的需求是:如果接收的订单消息在数据库中已经存在,那么执行update操作;如果没有存在,那么执行insert操作
代码逻辑:
线程启动后,发现:数据库表中有两条oderid相同的记录
通过查看日志发现:
两个线程相差时间极端,各自收到了同一个订单的推送消息,在执行数据库insert或update时,都判断出该订单在数据库表中不存在,所以都执行insert操作,造成数据库表中有两条orderid相同的记录
2.解决方案
synchronized同步代码块即加同步锁,synchronized同步代码块的功能:
1)、当A线程访问对象的synchronized代码块的时候,B线程依然可以访问对象方法中其余非synchronized块的部分
2)、当A线程进入对象的synchronized代码块的时候,B线程如果要访问这段synchronized块,那么访问将会被阻塞
上面用synchronized同步代码块解决了在单点服务器中涉及到的并发问题,但是synchronized同步代码块在部署到多台服务器会失效,因为假设A机器在在执行数据库insert,判断出数据库中没有某个订单的数据,同时此刻B机器也判断出没有该订单数据,两台机器都进行insert操作,造成数据库中有重复的订单数据
3.多台服务器相互之间的并发导致有重复的订单数据问题解决
解决方案:
在数据库层面,用unique唯一性约束来保证数据的数据库表orderid的唯一性.
添加了唯一性约束后,假设A机器insert成功了,那么B机器再insert的时候会违反唯一性约束,报InvocationTargetException这个异常,捕获该异常后,进行update操作
阅读全文
0 0
- 并发insert情况下会发生重复的数据插入问题
- 并发insert情况下会发生重复的数据插入问题
- 并发insert情况下会发生重复的数据插入问题
- 并发插入insert,根据状态判断重复记录的问题
- 大量数据情况下单线程插入和多线程(高并发)insert数据库的性能测试
- 数据库并发插入避免重复数据的问题
- 大量数据情况下单线程插入和多线程insert数据库的性能测试
- insert中加入where条件判断,解决插入重复数据的问题
- Java多线程:解决高并发环境下数据插入重复问题
- MYSQL锁表的用法,防止并发情况下的重复数据
- 插入及查询不重复数据的几种情况
- PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳。在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据。即使使用了第二个参数,也会重复,最好的方案是结
- 如何处理高并发情况下的DB插入
- 如何处理高并发情况下的DB插入
- 如何处理高并发情况下的DB插入
- 如何处理高并发情况下的DB插入
- 高并发重复插入数据的场景之一
- 防止发生ajax重复提交的情况
- codeforces790A
- GitHub+hexo+gitment搭建一个具有评论功能的个人博客(入门级)
- 常用的操作符
- 136. Single Number
- SpringMVC(七)国际化
- 并发insert情况下会发生重复的数据插入问题
- MySQL索引
- 数据库学习7
- package is corrupt, exception while verifying: undefined method `size' for nil:NilClass (NoMethodErr
- 玛丽奥吃金币
- iOS UITextFiled 用中文键盘输英文出现空格的解决方案
- openstack【Kilo】入门 【keystone篇】九: 创建openstack客户端环境变量脚本
- 设置Redis最大占用内存
- 不用数组,解决众数问题(前提 :众数出现的次数必须大于n/2)