V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Aluhao
V2EX  ›  问与答

MYSQL UPDATE 事务不一至

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

    然后建议每个金额操作都建个凭证表,每个收入支出都存入凭证。
    Aluhao
        2
    Aluhao  
    OP
       2022-06-20 11:27:50 +08:00
    @cheng6563 这些操作都没用到 SELECT 读出来更新的。
    Aluhao
        3
    Aluhao  
    OP
       2022-06-20 11:31:41 +08:00
    @cheng6563 有一个任务列表是 SELECT 读出来更新,会不会是这个问题?
    但是这个也是在时间戳如:time >= 1655568000 AND time <= 1655568000 + 60 查询出来的,这个没有并发问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2939 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:02 · PVG 22:02 · LAX 06:02 · JFK 09:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.