MYSQL UPDATE 事务不一至

2022-06-20 11:12:26 +08:00
 Aluhao
问题场景:
支付系统的一个用户统计表及过帐任务表:
统计表字段有:收款总金额、待拨款金额、可提现金额、提现金額等;
过帐任务表字段有:过帐时间、过帐金额等;
当收到支付成功会向此表`待拨款金额`字段更新+'交易金额';
系统有一个过帐功能,就是收到款后先入`待拨款金额`,然后根据每笔交易的支付时间加上多少天后过帐到`可提现金额`;
过帐的方法就是查询`过帐任务表`的过帐金额从用户统计表`待拨款金额`-'过帐金额',`可提现金额`+'过帐金额';
系统跑了二年了,最近才发现`待拨款金额`不足,但有还过帐列表中有帐没有过到`可提现金额`,全程都是用到事务;
事务:用户统计更新成功+过帐更新过帐成功才能全部通过。
不过统计表是包含有其它统计需要更新,有并发的存在,查了好久也不知道问题在那,这个会和并发有关吗?
通过 UPDATE +值的方式也会存在脏读数据吗?
请大家指教!
747 次点击
所在节点    问与答
3 条回复
cheng6563
2022-06-20 11:22:29 +08:00
单纯的 UPDATE +值不会有问题,但是先 select ,在外部进行逻辑计算后再 update 就可能重复读,请在 select 时加上 for update 对数据加上行锁。

然后建议每个金额操作都建个凭证表,每个收入支出都存入凭证。
Aluhao
2022-06-20 11:27:50 +08:00
@cheng6563 这些操作都没用到 SELECT 读出来更新的。
Aluhao
2022-06-20 11:31:41 +08:00
@cheng6563 有一个任务列表是 SELECT 读出来更新,会不会是这个问题?
但是这个也是在时间戳如:time >= 1655568000 AND time <= 1655568000 + 60 查询出来的,这个没有并发问题。

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

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

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

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

© 2021 V2EX