多线程并发情况下 重复insert问题
2024-10-20 05:38:49
代码逻辑:
if(数据不存在){
insert();
}
线程启动后,发现数据库表中有相同的记录
解决方案
synchronized同步代码块即加同步锁,synchronized同步代码块的功能:
- 当A线程访问对象的synchronized代码块的时候,B线程依然可以访问对象方法中其余非synchronized块的部分
- 当A线程进入对象的synchronized代码块的时候,B线程如果要访问这段synchronized块,那么访问将会被阻塞
synchronized if(数据不存在){
insert();
}
上面用synchronized同步代码块解决了在单点服务器中涉及到的并发问题,但是synchronized同步代码块在部署到多台服务器会失效,因为假设A机器在在执行数据库insert,判断出数据库中没有某个订单的数据,同时此刻B机器也判断出没有该订单数据,两台机器都进行insert操作,造成数据库中有重复的订单数据
多台服务器相互之间的并发导致有重复的订单数据问题解决
解决方案:
在数据库层面,用unique唯一性约束来保证数据的数据库表orderid的唯一性.
添加了唯一性约束后,假设A机器insert成功了,那么B机器再insert的时候会违反唯一性约束,报InvocationTargetException这个异常
最新文章
- Shell编程基础教程4--控制流结构
- spark配置
- Android的init过程(二):初始化语言(init.rc)解析
- mysql字段不能为空的字段为空时也能插入的方法
- SVN switch 用法详解
- LightOJ 1220 Mysterious Bacteria 水题
- 9.DataPager
- Android 开发无线调试
- [Manacher][HDU3613][Best Reward]
- 2014.8.16 if语句
- 将本地jar包打包到本地仓库和上传到私服
- awk if print
- Exception、Thorow、Throws、TryCatch
- JavaWeb数据库长时间不访问断开链接解决思路
- win10以管理员身份运行cmd方法
- Python递归函数介绍
- javascript 深度克隆对象
- HTML5布局
- Atcoder Tenka1 Programmer Contest 2019 题解
- spring mvc改动配置文件路径