并发写数据库如何避免重复数据

源码超级联盟 2015-11-18 09:16:32
页面上将选中的数据(A表中的纪录)插入到C表中,还有一个定时任务,将A表中的纪录插入到C表中,那么请问如何避免插入的数据重复? 正在苦苦思索中,请各位经验丰富的大哥大姐给个方案。
...全文
2980 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
鸣鸣Amadues 2015-11-30
  • 打赏
  • 举报
回复 1
数据库本身就是有锁的,执行SQL有个队列,即使在Java层有N个并发请求对同一条数据进行操作,在数据库层也一定有个执行顺序先后,不会在数据库插入两条一样主键的记录,所以像你这种直接插入数据的需求不用去考虑是否要在代码里加锁。 另外,不要采用先读取判断的做法,因为并发请求里读出来的很可能都是过时数据(脏数据),如果你要先读再插入,那反而需要加锁,一旦在Java层要加锁了,不仅代码更加复杂,需要你考虑得更多,而且影响并发效率。 需要加锁的场合,我举个例子,比如有个某个操作先从数据库读出一个数据,然后+1,再更新回数据库,显然这个操作你必须在Java层就加锁,不然你很可能读出数据的同时,已经有别的请求把这个数据更新过了。
鸣鸣Amadues 2015-11-30
  • 打赏
  • 举报
回复
引用 11 楼 oracle1158 的回复:
[quote=引用 6 楼 Raffin 的回复:] 重复数据的含义是不是主键重复? 有一种操作叫做modify,就是insert+update,如果没有就插入,如果有就更新。 这个逻辑可以自己封装,然后在自己的程序里调用。 效率会慢点。
主要是如果出现并发的情况,两个进程判断都没有数据,一起插入数据了怎么办?[/quote] 首先,modify可以自己写逻辑,你可以先试着查询,有就执行update,没有就执行insert;也可以直接insert,失败后再执行update 然后,在数据库层面执行SQL一定会有先后顺序的,如果并发的两个操作主键相同,那后执行的会失败的,失败后怎么处理看你的需求。
tiaoxixiaoji 2015-11-30
  • 打赏
  • 举报
回复
插入前先判断啊。。
源码超级联盟 2015-11-28
  • 打赏
  • 举报
回复
引用 6 楼 Raffin 的回复:
重复数据的含义是不是主键重复? 有一种操作叫做modify,就是insert+update,如果没有就插入,如果有就更新。 这个逻辑可以自己封装,然后在自己的程序里调用。 效率会慢点。
主要是如果出现并发的情况,两个进程判断都没有数据,一起插入数据了怎么办?
源码超级联盟 2015-11-28
  • 打赏
  • 举报
回复
引用 8 楼 sinat_19250161 的回复:
这个要看哪个优先级高,反过来也是可行的
引用 7 楼 sinat_19250161 的回复:
选中插入的数据取一个字段,最好是唯一的,然后在定时任务中每一条数据都取这个字段进行判断,是否存在,存在就跳过!
主要是如果出现并发的情况,两个进程判断都没有数据,一起插入数据了怎么办?
sinat_31535993 2015-11-19
  • 打赏
  • 举报
回复
最简单的就是搞个触发器,在插入之前,比对有无重复数据
这个逗b 2015-11-19
  • 打赏
  • 举报
回复
设置主键
sinat_19250161 2015-11-19
  • 打赏
  • 举报
回复
这个要看哪个优先级高,反过来也是可行的
引用 7 楼 sinat_19250161 的回复:
选中插入的数据取一个字段,最好是唯一的,然后在定时任务中每一条数据都取这个字段进行判断,是否存在,存在就跳过!
sinat_19250161 2015-11-19
  • 打赏
  • 举报
回复
选中插入的数据取一个字段,最好是唯一的,然后在定时任务中每一条数据都取这个字段进行判断,是否存在,存在就跳过!
鸣鸣Amadues 2015-11-19
  • 打赏
  • 举报
回复
重复数据的含义是不是主键重复? 有一种操作叫做modify,就是insert+update,如果没有就插入,如果有就更新。 这个逻辑可以自己封装,然后在自己的程序里调用。 效率会慢点。
路西法01 2015-11-19
  • 打赏
  • 举报
回复
这个问题经常遇到,改代码总是有重复。 最省事的办法就可以建唯一约束
邹邹wl 2015-11-18
  • 打赏
  • 举报
回复
唯一键约束。
Cx_轩 2015-11-18
  • 打赏
  • 举报
回复
插入后返回一个插入的id ,通过这个id来判断是否已经插入,来避免插入重复的数据. 你觉得这个可否?
大饼干叔叔 2015-11-18
  • 打赏
  • 举报
回复
选中插入c表的a表数据在插入完成之后,给自己上标记,定时任务进行插入的时候通过标记来过滤,这样你看合适不?

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧