思路
思路
BEGIN;
INSERT INTO msg_dedupe(msg_id, created_at) VALUES (?, NOW());
-- 唯一键冲突则回滚并视为已处理
UPDATE account SET balance = balance - 100 WHERE id = ?;
COMMIT;去重记录需要设置合理的保留窗口并定期归档,长窗口会带来存储与索引成本。
用数据库唯一约束或去重表记录已处理的消息标识,重复投递时直接跳过;与业务更新放在同一事务中,才能保证“处理+记录”原子。
BEGIN;
INSERT INTO msg_dedupe(msg_id, created_at) VALUES (?, NOW());
-- 唯一键冲突则回滚并视为已处理
UPDATE account SET balance = balance - 100 WHERE id = ?;
COMMIT;