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超级智能客服

相关推荐
!chen8 小时前
数据库主从有延迟怎么处理
数据库·adb
SelectDB技术团队8 小时前
Apache Doris 多云原生实践:SaaS、BYOC 与四大公有云覆盖
数据库·阿里云·云原生·华为云·腾讯云·亚马逊云·写入更新
云飞云共享云桌面10 小时前
医疗器械设备研发:多人同时操作 SolidWorks,怎样依靠单台服务器替代多工作站
运维·服务器·网络·数据库·制造
Sylvia33.10 小时前
LOL实时数据接入深度解析:从WebSocket到完整数据模型
java·网络·python·websocket·网络协议
梦想不只是梦与想10 小时前
Web 服务器网关协议:ASGI 和 WSGI
服务器·python·fastapi
ai小陈12 小时前
PyTorch DataLoader数据加载性能排查:GPU利用率低的实操指南
人工智能·pytorch·python·深度学习·ai·gpu算力
2601_9622992415 小时前
Azure python操作系统列表
python·操作系统·azure·虚拟机·存储配置文件
知行合一。。。15 小时前
RAG--03--Milvus基本用法
数据库·oracle·milvus
TDengine (老段)15 小时前
TDengine 线程模型 — 网络、调度、执行
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
学术 学术 Fun16 小时前
如何用 API 与 Webhook 批量把图表图片转换成 VSDX
python·自动化·api·visio