Alucns
V2EX  ›  问与答

MYSQL UPDATE 事务不一至

  •  
  •   Alucns · Jun 20, 2022 · 1138 views
    This topic created in 1456 days ago, the information mentioned may be changed or developed.
    问题场景:
    支付系统的一个用户统计表及过帐任务表:
    统计表字段有:收款总金额、待拨款金额、可提现金额、提现金額等;
    过帐任务表字段有:过帐时间、过帐金额等;
    当收到支付成功会向此表`待拨款金额`字段更新+'交易金额';
    系统有一个过帐功能,就是收到款后先入`待拨款金额`,然后根据每笔交易的支付时间加上多少天后过帐到`可提现金额`;
    过帐的方法就是查询`过帐任务表`的过帐金额从用户统计表`待拨款金额`-'过帐金额',`可提现金额`+'过帐金额';
    系统跑了二年了,最近才发现`待拨款金额`不足,但有还过帐列表中有帐没有过到`可提现金额`,全程都是用到事务;
    事务:用户统计更新成功+过帐更新过帐成功才能全部通过。
    不过统计表是包含有其它统计需要更新,有并发的存在,查了好久也不知道问题在那,这个会和并发有关吗?
    通过 UPDATE +值的方式也会存在脏读数据吗?
    请大家指教!
    3 replies    2022-06-20 11:31:41 +08:00
    cheng6563
        1
    cheng6563  
       Jun 20, 2022   ❤️ 1
    单纯的 UPDATE +值不会有问题,但是先 select ,在外部进行逻辑计算后再 update 就可能重复读,请在 select 时加上 for update 对数据加上行锁。

    然后建议每个金额操作都建个凭证表,每个收入支出都存入凭证。
    Alucns
        2
    Alucns  
    OP
       Jun 20, 2022
    @cheng6563 这些操作都没用到 SELECT 读出来更新的。
    Alucns
        3
    Alucns  
    OP
       Jun 20, 2022
    @cheng6563 有一个任务列表是 SELECT 读出来更新,会不会是这个问题?
    但是这个也是在时间戳如:time >= 1655568000 AND time <= 1655568000 + 60 查询出来的,这个没有并发问题。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3803 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 04:34 · PVG 12:34 · LAX 21:34 · JFK 00:34
    ♥ Do have faith in what you're doing.