技术与生活 / 一篇记录
一半成功的操作,交给事务处理
两项相关修改若分开提交,中间失败就可能留下不一致状态。事务把数据库内的工作组合成一个提交单元,调用方可以根据完整结果决定提交还是回退。
先明确这里的区别
相关变更需要作为一个整体提交,避免只完成一半。
查询示例以 SQLite 为例;notes 为测试表,包含 id、title、score、category、created_at 字段。
BEGIN;
UPDATE notes SET score = 10 WHERE id = 1;
ROLLBACK;
怎样判断处理正确
回退后查询原记录,确认没有保留试验修改。
先在测试库执行修改并回退,再核对原值。还要考虑驱动是否自动开启事务;外部通知或文件写入并不会因为数据库回退而自动撤销。
事务持续时间也值得关注。把很慢的外部调用夹在事务中间,会延长锁或资源占用。先准备必要输入,再在尽可能清晰、短小的数据库阶段中完成相关写入。
需要留意的是,事务不能自动回退已经发送的邮件或外部 HTTP 请求。
参考:SQL 文档。