美文网首页
账户余额更新优化

账户余额更新优化

作者: little多米 | 来源:发表于2022-04-06 19:32 被阅读0次

业务场景
用户预存一定余额,可以用余额在平台购买套餐商品,支付扣除余额需控制并发,当前采用的是乐观锁方式。即每个用户的余额记录都有一个版本号,更新记录时,需要带上版本号。版本号采用整数递增。
问题
当有两个扣减余额的操作同时发生时,其中一个有几率失败。失败结果直接返回给用户,此时用户操作重试即可,但会影响用户体验。如果一直处于高并发状态,用户可能会连续操作失败多次。主要针对此扣款失败场景进行优化。
方案演进
增加失败重试

int i = 0, max = 3;//最多尝试3次
while (i < max && !success) {
    //获取余额记录
    AgentRechargeEntity arEntity = agentRechargeService.findByAgentId(context.getAdminUserEntity().getAgentId());
    //版本记录值,用于控制并发操作
    Integer exceptTxVersion = arEntity.getTxVersion();
    //修改金额计算
    //更新余额
    success = agentRechargeService.updateMoneyByExpectTxVersion(id, exceptTxVersion, money);
    i++;
}

进行上面重试修改之后,仍然存在失败日志


image.png

通过分析日志可知,失败时确实有三次重试,说明我们修改的代码是生效的。问题在于,失败后重新获取的记录值仍然是老的数据,版本号expectTxVersion没有变化。实际获取上次更新记录值如下。


image.png

怀疑是可能存在缓存,该方法使用的是mybatis框架,由于我们没有人为增加缓存,会不会是mybatis的缓存。经研究,mybatis默认是开启二级缓存的,于是通过在select方法上增加flushCache="true" useCache="false"配置去除缓存。


image.png

然后更新上线了,本以为就此结束,然而。。。还是一样的失败日志。
重新分析:更新失败说明版本号已经变更了,意味着其他修改已经提交入库了。
为什么没有读到其他事务的最新数据呢,研究一下事务的隔离级别。
查看mysql默认的隔离级别:

select @@transaction_isolation;
image.png

默认为:可重复读,看下该级别的定义。

一个事务启动的时候,能够看到所有已经提交的事务结果。但是之后,这个事务执行期间,其他事务的更新对它不可见。

因为获取记录操作是在事务中,所以重复获取不能得到最新数据。
因此,可以将数据获取排除到事务之外,主要用spring的事务传递管理,设置为Propagation.NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

image.png

再看日志,虽然也有失败,但基本重试一次之后就成功。


image.png

至此,问题解决。
总结
本以为是一个简单的重试优化,逐渐引出mybatis二级缓存和数据库的事务管理。任何一个点的遗漏都达不到想要的效果。平时的知识储备是必要的,否则遇到问题时将花费成倍的时间。

相关文章

  • 账户余额更新优化

    业务场景用户预存一定余额,可以用余额在平台购买套餐商品,支付扣除余额需控制并发,当前采用的是乐观锁方式。即每个用户...

  • Mybatis Update没执行

    引言 某项目采用“同步请求+异步回调”的方式,实现了用户账户信息的更新(余额、冻结金额等)。有时调用账户更新方法时...

  • 热点账户问题

    账户频繁转入转出的现象解决办法:1.先insert的账户流水,定时去做汇总更新余额2.拆出子账户,分散压力3.放入...

  • 账户余额

    这个余额是我目前银行卡账户的余额。 假如这是真的话。我会去干什么? 去买个大点的房子?应该不会。在大城市里买房一直...

  • 账户余额

    看了很多关于没钱引发的社会纠纷,忽然想起好多年前,一个比我大好几岁的姐姐的话,她说老公的账户可控现金一定要控...

  • 支付宝是如何处理热点账户高并发转账问题的

    前言:方案设计前提 一般账务系统对账户的冲扣需要满足以下两点 1:更新账户表中的账户余额。 2:记录账户明细表中的...

  • Power Pivot中多账户如何显示余额?

    (二) 多账户显示余额 如果存在多个账户的话,我们该如何显示余额呢? 银行信息表 余额表 我们有2个需求 任意点...

  • 比特币钱包-btcwallet(四)账户余额统计

    本文将讲解账户余额的统计。 1 getbalance 账户层面的余额统计 主干流程 核心流程是 https://...

  • 小碧【财富自由日记】01

    ✅查看了3个托管的账户 重新更新了软件以及登录的方式。 一开始对于账户余额没有变化,感到担忧。马上去咨询了博士,给...

  • 关于账户余额存储的相关数据库设计总结

    最近在做相关账户资金存储的设计,希望能对余额进行实时的存储,同意能够快速地查询到相应账户的当前账户余额。没有做过财...

网友评论

      本文标题:账户余额更新优化

      本文链接:https://www.haomeiwen.com/subject/jxkdsrtx.html