屎山代码导致一部分用户付款后被扣除了两次余额,第二次扣款是没有创建余额变动记录的, mysql 如何快速找出这部分余额异常的用户?

2022-12-02 06:05:04 +08:00
 edis0n0
余额变动表有一亿条了,全遍历一遍感觉要很久,有没有效率高的方法?因为这个问题已经出现一天才收到反馈,很多用户在那之后又充值或付款了新订单,不能直接判断最后一次变动金额和当前余额相等。
3857 次点击
所在节点    数据库
23 条回复
T0m008
2022-12-02 06:08:54 +08:00
第二次扣款没有余额变动记录你怎么在余额变动表里找? mysql 这条路无解。

先通过时间段把被扣款用户粗略筛选出来,然后再看能不能细分。
eason1874
2022-12-02 06:14:36 +08:00
一亿条也不是很多吧,先把这段时间付款的用户 ID 导出列表,然后分成几批同时跑,再慢,几个小时也该跑完了。有时候简单粗暴的方法就是最快的方法
danhahaha
2022-12-02 08:18:14 +08:00
直接去访问记录里面找出访问过下单界面的用户
bao3
2022-12-02 08:21:19 +08:00
我和二楼的疑问一样
leaves615
2022-12-02 08:37:49 +08:00
测试不到位。
bthulu
2022-12-02 08:55:01 +08:00
既然第二次扣款是没有创建余额变动记录的, 那不就相当于没有扣款么, 那你什么都不用干就行了, 反正用户余额也没变少, 你们的余额也没增加.
Xusually
2022-12-02 09:02:12 +08:00
@bthulu op 是说钱多扣了,但是扣款记录没有,余额已经少了
Lexgni
2022-12-02 09:06:58 +08:00
把收款方流水拿出来,再把用户收款流水拿出来,对比一下
wqhui
2022-12-02 09:08:20 +08:00
第一次付款后余额是 A ,该用户下一次有记录的充值 /付款订单,变动前余额是 B ,那么造成 A 到 B 的差额订单就是丢失了
mg52033
2022-12-02 09:10:53 +08:00
@Lexgni 他这个估计是自建的钱包
pjntt
2022-12-02 09:20:36 +08:00
如果确认是第二扣款没有记录的。那就找交易流水,把有 2 次及以上的交易用户就是异常的。
8355
2022-12-02 09:35:33 +08:00
如 2 楼所说确实 你能确定明确的时间筛出来最后其实没多少
救火任务要先考虑救火方式 先修 bug 再捞数据
看一遍代码才能了解问题出在哪里 之后根据现有表结构和数据去排查
起码是不是先把并发锁和事务加上。。。。
changyang
2022-12-02 09:36:18 +08:00
这个要看余额变动表里面有没有记录本次扣除后剩余余额,如果记录的了的话就能根据这个剩余余额查询。
假设
用户表 user:
userId 用户 id
money 剩余金额

余额变动表 moneyChage:
userId 用户 id
createTime 创建时间
lastMoney 扣除后剩余金额
deductMoney 本次扣除金额

1 ,先查询最近一天的订单(问题以来的)
2 ,查询这些订单所属用户。userList
3 ,循环查询用户的余额变动记录,查询有问题的用户
for user in userList
userMoneyChangeList = queryUserMoneyChangeListDescByCreateTime(userId) (以创建时间倒排)
lastMoney = user.money
for changeItem in userMoneyChangeList
if lastMoney != changeItem.lastMoney:
print("该用户余额不符,userId: %s" , user.userId)
lastMoney = lastMoney + deductMoney
changyang
2022-12-02 09:40:05 +08:00
以上还可以优化一下 queryUserMoneyChangeListDescByCreateTime 方法,在 sql 中只限定查询问题时间以来的
jorneyr
2022-12-02 09:42:17 +08:00
以前参与的英国电商项目,异常没处好导致给客户信用卡扣款 150 多次,直到额度不够。
时不时发生,几年了这个 Bug 没解决掉,把钱还给客户就解决了问题。
changyang
2022-12-02 09:42:26 +08:00
如果嫌慢可以加入线程,查询出 userList 后,把 userList 切分成 N 组放入线程任务中进行查询最后组合,会更快。
Huelse
2022-12-02 10:02:04 +08:00
有日志吗?
wudi77
2022-12-02 12:06:34 +08:00
查交易流水,比对
dcsuibian
2022-12-02 12:59:51 +08:00
这个帖子能有效降低我写出 bug 时的愧疚感
0x0208v0
2022-12-02 13:03:36 +08:00
想知道楼主是怎么解决这个问题的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/899492

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX