数据更新假象

    在开发的过程中,和数据库打交道是常有的事情,基本上伴随着我们每一天。最近遇到了一个特别诡异的事情,当通过排查各种原因找到问题的根源之后,其实也就是一个很简单的问题。可一些问题,往往是最初会让人抓狂,不知所措。遇到了问题,还是需要冷静下来,对各种情况进行分析,并最终找出问题的解决方案。我特别喜欢一句话:总搞得定

 

    下面在这里简单和大家分享一下我遇到的这个问题,问题现象如下:一个定时任务,会更新本地的两个表(盘点设备表和外部关联表,关联表存储盘点工单的状态),同时还会同步设备的信息到一个外部系统,主要有三个动作。线上却发现:一批盘点工单处理完之后,定时任务执行完,预期所有盘点工单的状态以及盘点设备表的数据都会成功更新,可实际上大部分数据失败了。预期的结果应该是:盘点设备表设备状态更新为成功,外部关联表状态成功(这个没有问题)。

 

    分析问题的过程:排查定时任务当中的每一个业务逻辑,每一个接口操作和逻辑处理分支增加日志,可最终也没能发现问题。好,继续,通过变更记录看,盘点设备表有变更的记录(是我们预期的),可实际上数据库并没有成功更新。这是为什么呢?有成功更新的变更记录,数据库却没有更新!!!诡异!!!!

 

    。。。。。。

 

    这个问题的排查,中途也放置了一段时间,没有去理会,实在找不出什么原因了。后来一些同事一起再次梳理,准备再一次进行突破。这一次,对每一个操作盘点设备表的地方添加变更记录,找出同一个时间点,到底哪些地方会修改盘点设备表。果然,这一次修改后发布到线上,定位到了问题的原因。定时任务本身修改数据没有问题,但是定时任务操作的时候随后被其他地方覆盖,所以影响了我们本身的业务。现在问题解决了,回头看看,这个问题不算什么难题,可花了不少的时间。皱眉

 

    通过多次努力,找到了问题的原因,一个事务操作的数据被另一个事务覆盖掉了,可为什么为导致这个问题呢?项目中我们使用了MyBatis自动生成的更新语句,在程序当中,每一个事务中的更新操作又是针对原始一条完整的记录进行操作,这样导致的问题就是:不管数据有没有变更,最后所有字段都会更新一遍到数据库。所以解决办法就是:每一次更新,拿到对象的唯一主键标识创建一个新的对象,把要变更的字段进行重新赋值,然后更新到数据库,这样就不会影响到原有没有变动的字段信息。

 

总结:

1、遇到问题,需要有一个冷静的头脑,也要找对方法,一步一步去分析问题;

2、对于问题,一个人的想法是局限的,需要和大家多沟通沟通,发散思维;

3、排查问题的一些方式:打日志、记录变更记录、异常邮件通知;

4、面对问题,告诉自己,总搞得定!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值