职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 526|回复: 8

为什么hibernate会插入两条相同的记录(偶尔)

[复制链接]
broken 发表于 2011-8-21 10:37 | 显示全部楼层 |阅读模式
前几天和朋友讨论他遇到的问题:为什么hibernate会插入两条相同的记录(偶尔)?

是这么回事:
有两个表: A表 ,B表 一对一的关系,通过Quartz定时任务轮循A表,如果A表有新记录,则插入一条新记录到B表,如果B表已存在记录则更新此记录;

为什么新插入到B表的数据偶尔会出现两条呢?

还有个奇怪的事,在本地测试永远不会出现两条相同的,放在测试服务器就偶尔会出现。

当时看了仔细看过代码肯定不会有问题,刚开始以为是hibernate持久化引起的,后来在save()方法后调用flush()问题
还是没有解决?

由于刚进公司对公司整个架构也不是太了解,后来去请教架构师,找到问题可能出现集群上,因为测试服务器是集群环境,而本地不是,而在集群环境相当于启动了多个定时任务在做相同的事情,因而出现了这种问题,后来将定时任务提取出来,问题不再出现,问题终于解决。

其实公司原来的定时任务都是放到一个工程,是单独放出来(不在集群环境内)。


问题原因归纳
1.没往集群环境去想,考虑问题不够全面
2.公司没有提前对员工有详细的架构讲解

希望对出现相同问题的朋友有所帮助。




yoyo 发表于 2011-8-21 10:37 | 显示全部楼层
我现在也遇到了类似的问题,谢谢lz的提醒

紫衿 发表于 2011-8-21 10:38 | 显示全部楼层
其实归结起来还是集群中的并发问题,只要存在“check-then-act”模式就会存在争用。如果时机合适,这种情况就会出现。对于LZ提到的情况,可以通过特定的机制,使得定时程序只在集群中的特定的机器上运行,比如特定的IP绑定都是可以解决的。

爱车车 发表于 2011-8-21 10:38 | 显示全部楼层
A表么有用乐观锁回滚么

只学java 发表于 2011-8-21 10:38 | 显示全部楼层
ieye 写道
其实归结起来还是集群中的并发问题,只要存在“check-then-act”模式就会存在争用。如果时机合适,这种情况就会出现。对于LZ提到的情况,可以通过特定的机制,使得定时程序只在集群中的特定的机器上运行,比如特定的IP绑定都是可以解决的。


我觉得通过特定的IP绑定是个很好的解决,如果将定时程序单独出来就没有很好的利用集群环境

谢谢

 楼主| broken 发表于 2011-8-21 10:38 | 显示全部楼层
抛出异常的爱 写道
A表么有用乐观锁回滚么

+1...有乐观锁的话...会出现回滚

只学java 发表于 2011-8-21 10:38 | 显示全部楼层
抛出异常的爱 写道
A表么有用乐观锁回滚么


学习了

爱车车 发表于 2011-8-21 10:38 | 显示全部楼层
除了写数据库,定时任务在其他业务上也容易出现这种重复执行的问题。
我之前有个项目是发短信的,定时任务的配置在core包中。原先只有一个web1工程,它依赖于core,定时任务没问题。后来新加了一个web2工程,它也依赖于core。这样就会同时跑2个相同的任务了。
后来解决的方法是:对任务启动加入一个开关。web1开启,web2关闭。并且保证,web1不会出现集群。

能文能武 发表于 2011-8-21 10:39 | 显示全部楼层
flysnowxf 写道
除了写数据库,定时任务在其他业务上也容易出现这种重复执行的问题。
我之前有个项目是发短信的,定时任务的配置在core包中。原先只有一个web1工程,它依赖于core,定时任务没问题。后来新加了一个web2工程,它也依赖于core。这样就会同时跑2个相同的任务了。
后来解决的方法是:对任务启动加入一个开关。web1开启,web2关闭。并且保证,web1不会出现集群。


A表中加入一个IP字段,集群中各定时任务只执行包含自己IP的记录
这样都互不干扰,很好的运用集群环境.
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-17 02:47 , Processed in 0.118981 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表