hibernate同时插入两条相同数据(偶尔)原因调查

2 篇文章 0 订阅
1 篇文章 0 订阅

项目测试阶段,遇到一个问题:
一条数据,会被同时更新两条,而且还是偶发的,这个就比较尴尬了,代码也顺过了,单人测试也测试过了,没什么问题。后来,在晚上找资料时,找到一篇博客,博文如下:
前几天和朋友讨论他遇到的问题:为什么hibernate会插入两条相同的记录(偶尔)?

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

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

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

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

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

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

之后,和同事两个人同时登陆一个账号,同时提交数据,终于发现了问题所在!MD,一个事务中处理的逻辑太多了,导致两个插入任务最后一期提交了,OK,问题找到了,接下来就是解决方案了:

1.加入乐观锁;
2.在账号登录的时候,做限制,同一个用户只允许在一个客户端登录。
不过,这两个方法,我还没有实践,等实际操作完,我再来更新文章!

方法一验证:
1.加入乐观锁的方法,这里推荐一篇博客:
https://www.cnblogs.com/otomedaybreak/archive/2012/01/27/2330008.html
博客讲的很详细,这里就不再赘述。有一点需要注意,作为乐观锁的标识字段,程序不能对他们做操作,由hibernate来完成!
关于方法二,就懒得验证了。。。。

仅做记录参考,如有问题,请各位大佬指正!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值