文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

数据库update时出现的问题怎么解决

2024-04-02 19:55

关注

这篇文章主要介绍了数据库update时出现的问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇数据库update时出现的问题怎么解决文章都会有所收获,下面我们一起来看看吧。

数据库update时切忌这样干,这样干是什么?请随我来看看。

早些时候,客户发来这样一段文字“XX的,XXXXXXXX有个10万没到账,帮加上去。”我马上动手查看数据库,寻找原因,随后回复了这样一句话“开玩笑吧”。虽然之前发生过类似这样的问题,但都是小额资金,就手动在数据库里加了,遇到这么大的资金还是头一次,于是我加紧翻看数据库记录的节奏。

我发现用户的入金记录的确已经是审核通过状态,而用户的可用资金却没有加上,这已经让人意外了。

接着我查看代码,并没有发现逻辑上的问题,这又让我感到迷茫。

再翻看日志,发现没有任何异常,好吧,感觉被设了局一样。

回头想想,这种情况并不多见,程序在多数情况下并没有这种情况,一切正常。这糟了,没有错误日志就是***的错误。

静下心来,我想有可能是事务出现的问题,因为对于资金表,同一个用户的资金在同一个时间点是可能同时被更新的,我猜想,是入金记录先插入了出入金记录表,等到更新资金表的时候被锁住,事务超时后插入的记录没有回滚,于是我通过这样的方式来证明一下。

START TRANSACTION; INSERT INTO record VALUES(1,123); UPDATE money SET money = money + 10; COMMIT;  START TRANSACTION; UPDATE money SET money = money + 100; COMMIT;

通过手动控制事务锁,发现不是我想的那样。然后我又试了试下面这种方式:

START TRANSACTION; UPDATE money SET money = money + 10; INSERT INTO record VALUES(1,123); COMMIT;  START TRANSACTION; UPDATE money SET money = money + 100; COMMIT;

发现两者的效果是一样的,事务都会回滚。

这个时候,我的思路被禁锢了,我和同事讨论起来,看看他有什么想法,经过一番思想斗争后,果然同事还是给出了他的想法,我深感赞同。

MoneyUser moneyUser = moneyUserMapper.selectByPrimaryKey(members.getUid());    // 冻结资金-出金金额    moneyUser.setFrozenl(moneyUser.getFrozen().subtract(moneyTransfer.getount()));    // 可用资金+出金金额    moneyUser.setTotaaymoney(moneyUser.getTotalpayey().add(moneyTransfer.getount())); this.moneyUserMapper.updateByPrimaryKey(moneyUser);

这样的代码在出现并发的时候,获取moneyUser对象的时候,其中的冻结资金和可用资金加入都是0,那么两个并发在update的时候,两个都执行了,但是起初的冻结资金和可用资金相同,就会导致有一笔资金没有加上。

调试的时候更容易发现这个问题。OH,my 噶,真是个大问题,还出在资金的问题时,我真庆幸这个问题发生的频率不够高。不过我到底是应该庆幸还是不庆幸呢,也许次数发生的多起来的时候,我就更容易来反思来找出问题的症结所在。

那么问题怎么解决呢?

UPDATE moneser   SET   frozapital = frozpital - #{amount,jdbcType=DECIMAL},   totaloney = totaloney + #{amount,jdbcType=DECIMAL}   WHERE uid = #{uid,jdbcType=INTEGER}

通过在sql语句中进行字段的更新操作,而不是在Java类中,因为mysql本身是会有这方面的处理方式的。

关于“数据库update时出现的问题怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“数据库update时出现的问题怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯