记一次脏读导致的数据错误

记录一次修改表中的金额可能导致数据库脏读的情况

场景是:一张订单明细表,一张订单总金额表。目前订单只有个产品。所以订单总金额表里记录只有一条数据。当订单明细表增加时,同事更新总金额表。接口调用是通过MQ消息推送。

原来的开发逻辑,明细表数据入库之后。查询总金额表是否有数据,没有就进行新增,有就进行更新。

明细表数据入库这块是没有任何问题的,这块不用管。主要是更新总金额表的地方存在潜在的脏读问题。

第一次的具体实现:数据入库后,查询总金额表,返回对象totalAmount,判断totalAmount是否为null,如果为null,则新增一条记录,这个分支么有任何问题的不用管。如果不为null,说明totalAmount记录已经存在了,需要更新他的金额字段。更新的语句也是传的totalAmount这个对象的,所以我重新给totalAmount的属性amout赋值了,在原来的amount上加上本次传过来的amount。然后调用更新方法,传对象totalAmount就可以了。

这个是原先的实现方法,感觉一切都那么的自然,没有任何问题的。但是恰恰就是这里是有问题滴。假设上面的场景MQ推送了两条数据过来,第一条数据执行到一半是还没有执行到数据库时,第二条数据MQ也推送过来了。此时查询库里是否有订单总金额时和第一条查询时返回的结果是一样的。然后接着第一条更新数据库执行完毕。第二条数据给amount赋值时,就是把前面第一条刚刚更新的数据就覆盖了。导致该条数据在明细表添加了,却在总金额表里没有累加到。

修改之后的实现方法,前面都是一样的,只是在累加总金额时做了调整。原来是在代码里计算添加总金额,然后重新set到对象totalAmount中,现在我们不在在代码计算,而是直接在sql语句上计算,更新订单总金额表的总金额是 set amount=amount+本次明细的金额。这样修改在库里更新的时候就不会出现上面说那种情况了。当然这个脏读也只是偶发,可能测试数据少,很难发现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值