mysql如何设计积分系统_mysql流水账与余额对账
流水表必须带唯一业务单号trade_no并建唯一索引用INSERT IGNORE或ON DUPLICATE KEY UPDATE防重余额统一用BIGINT存最小单位所有增减走原子UPDATE对账分实时查最近N条与离线每日全量SUM比对两层事务须同库同表禁止跨库跨服务。流水表必须带唯一业务单号不能只靠自增ID对账余额不准90%出在流水重复或漏写。自增 id 只是插入顺序标识不是业务凭证——同一笔充值可能因重试插入两次而 id 不同但业务单号相同。流水表必须有 trade_no 字段如 pay_202405211023456789加唯一索引UNIQUE KEY uk_trade_no (trade_no)写流水时用 INSERT IGNORE 或 ON DUPLICATE KEY UPDATE 拦住重复单号而不是靠应用层“查一遍再插”对账脚本比对时只以 trade_no 为基准完全忽略 id 和插入时间余额字段别存浮点数用 BIGINT 存「分」或「最小积分单位」MySQL 的 FLOAT / DOUBLE 会丢失精度比如 0.1 0.2 ≠ 0.3积分清零、发放、扣减全乱套。哪怕你用 DECIMAL(12,2)也扛不住高并发下的读写竞争和四舍五入误差。统一用 BIGINT单位是「1积分」不带小数——用户看到的 12.5 积分在库里存 1250单位0.01分或直接 125单位0.1分看业务粒度所有增减操作走 UPDATE user_point SET balance balance ? WHERE user_id ? AND trade_no ?避免先查后更新余额校验脚本里SUM(amount) 流水总和必须和 balance 完全相等差1都不行——这是对账硬门槛对账不是“跑个SQL”得区分「实时核对」和「离线兜底」线上服务不能每笔都查流水总和来校验余额太慢但完全不校出错发现就晚了。得拆成两层轻量实时校验 异步全量对账。 MacsMind 电商AI超级智能客服
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2521359.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!