事务边界

数据库事务把一组读写视为一个工作单元。提交成功后结果整体可见;发生错误时回滚,避免只完成一半。事务范围应覆盖必须同时成立的数据约束,但不宜包含长时间网络调用。

把远程请求放在数据库事务中等待,可能长时间占用锁。更常见的做法是先在本地记录待处理状态,提交后再由后台任务调用外部系统。

隔离级别

并发事务可能出现不可重复读取、幻读或写入冲突。数据库提供不同隔离级别,在一致性和并发性能之间取舍。使用较高隔离级别时,应用需要准备重试因序列化冲突而失败的整个事务。

无论隔离级别如何,主键、唯一约束、外键和检查约束仍是数据完整性的基础。应用代码校验不能替代数据库约束。

跨系统一致性

一个操作同时涉及本地数据库、消息系统和远程接口时,很难用单个数据库事务覆盖全部步骤。工程上常采用最终一致:先确保本地事实可靠保存,再通过可重试任务把变化传播出去。

最终一致不是“以后自然会一致”,而是必须具备事件编号、重试、幂等、失败记录和核对机制。

本地消息表

本地消息表模式把业务更新和待发送事件写在同一个数据库事务中。事务提交后,独立任务读取未发送事件并投递。这样可以避免业务数据已经提交、事件却因进程中断而丢失。

BEGIN;
UPDATE records SET status = 'completed' WHERE id = ?;
INSERT INTO outbox(event_id, event_type, payload, status)
VALUES (?, 'record.completed', ?, 'pending');
COMMIT;

投递成功后更新消息状态。即使同一事件被发送多次,接收方也要按事件编号幂等处理。

数据核对

核对任务按时间段或编号范围比较不同系统中的关键字段。常见字段包括记录编号、状态、数量、时间和版本。差异需要分类:延迟、遗漏、重复、字段不一致或无法关联。

修正前先保留原始记录和判断依据。自动修正只适用于规则明确的情况;无法确定的差异应进入人工复核队列。核对结果本身也需要统计和留存。

参考资料