高并发时,进行insert操作出现重复记录问题分析
2017-03-21 17:46
274 查看
1.背景
在进行insert时,先query一下数据库,判断记录是否存在,如果存在,不执行插入操作。但是在数据量较大的时候,就会出现重复记录的问题。
2.解决方案
synchronized同步代码块即加同步锁,synchronized同步代码块的功能:
上面用synchronized同步代码块解决了在单点服务器中涉及到的并发问题,但是synchronized同步代码块在部署到多台服务器会失效,因为假设A机器在在执行数据库insert,判断出数据库中没有该条记录,同时此刻B机器也判断出没有没有该条记录,两台机器都进行insert操作,造成数据库中有重复的记录 。
3.多台服务器相互之间的并发导致有重复的订单数据问题解决
在数据库层面,用unique唯一性约束来保证数据的数据库表orderid的唯一性.
在进行insert时,先query一下数据库,判断记录是否存在,如果存在,不执行插入操作。但是在数据量较大的时候,就会出现重复记录的问题。
if (bean != null) { map.put("msg", "failed"); return map; } repaymentDao.insert(repaymentBean); map.put("msg", "success"); //扣除冻结账户 //updateUserAmount(repaymentBean); return map; }
2.解决方案
synchronized同步代码块即加同步锁,synchronized同步代码块的功能:
1)、当A线程访问对象的synchronized代码块的时候,B线程依然可以访问对象方法中其余非synchronized块的部分 2)、当A线程进入对象的synchronized代码块的时候,B线程如果要访问这段synchronized块,那么访问将会被阻塞
if (bean != null) { map.put("msg", "failed"); return map; }else { synchronized (this) { repaymentDao.insert(repaymentBean); map.put("msg", "success"); //扣除冻结账户 //updateUserAmount(repaymentBean); return map; }
上面用synchronized同步代码块解决了在单点服务器中涉及到的并发问题,但是synchronized同步代码块在部署到多台服务器会失效,因为假设A机器在在执行数据库insert,判断出数据库中没有该条记录,同时此刻B机器也判断出没有没有该条记录,两台机器都进行insert操作,造成数据库中有重复的记录 。
3.多台服务器相互之间的并发导致有重复的订单数据问题解决
在数据库层面,用unique唯一性约束来保证数据的数据库表orderid的唯一性.
添加了唯一性约束后,假设A机器insert成功了,那么B机器再insert的时候会违反唯一性约束,报InvocationTargetException这个异常,捕获该异常后,return。
if (bean != null) { map.put("msg", "failed"); return map; }else { synchronized (this) { try { repaymentDao.insert(repaymentBean); map.put("msg", "success"); //扣除冻结账户 //updateUserAmount(repaymentBean); return map; } catch (Exception e) { map.put("msg", "failed"); return map; } } }
相关文章推荐
- 并发插入insert,根据状态判断重复记录的问题
- 解决Oracle透明网关连接SQL server进行数据操作出现“列名无效”问题
- MySQL生产库Insert了2次同样的记录但是主键ID是不一样的问题的分析过程
- SQLite并发操作下的分析与处理,解决database is locked,以及多线程下执行事务等问题
- zTree插件和layer弹出层结合进行添加,删除,修改操作时,针对出现调用父父页面方法出现问题,解决方法
- 对web并发插入时出现重复记录的一点想法
- MySQL生产库Insert了2次同样的记录但是主键ID是不一样的问题的分析过程
- caffe按教程进行操作时出现的问题
- 解决tomcat在进行大并发请求时,出现内存溢出的问题
- 【51单片机学习过程记录】15 中断之串口中断查询方式中出现的问题及分析
- 关于Hibernate中fatch=eager的bag集合(一个java List)使用Criteria查询出现重复记录的问题
- mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY'
- SQL2008的查询分析器怪异问题,出现长时间“正在进行分析…”或“正在进行执行…”的状态栏
- MySQL生产库Insert了2次同样的记录但是主键ID是不一样的问题的分析过程
- selenium对未在屏幕展示范围内的元素进行操作时,出现元素无法定位的问题解决
- .NET2003安裝出现一直重启问题和SQL 2000安装出现“以前进行的程序安装创建了挂起的文件操作。运行程序之前,必须重新起动计算机。”~[解决方案]
- 使用mysql的limit进行分页时出现重复问题
- this.getHibernateTemplate().find()出现查询到的记录重复的问题
- spark-DataFrame学习记录-[2]解决spark-dataframe的JOIN操作之后产生重复列(Reference '***' is ambiguous问题解决)
- 并发insert情况下会发生重复的数据插入问题