← 全部文章

技术与生活 / 一篇记录

一半成功的操作,交给事务处理

两项相关修改若分开提交,中间失败就可能留下不一致状态。事务把数据库内的工作组合成一个提交单元,调用方可以根据完整结果决定提交还是回退。

先明确这里的区别

相关变更需要作为一个整体提交,避免只完成一半。

查询示例以 SQLite 为例;notes 为测试表,包含 id、title、score、category、created_at 字段。

BEGIN;
UPDATE notes SET score = 10 WHERE id = 1;
ROLLBACK;

怎样判断处理正确

回退后查询原记录,确认没有保留试验修改。

先在测试库执行修改并回退,再核对原值。还要考虑驱动是否自动开启事务;外部通知或文件写入并不会因为数据库回退而自动撤销。

事务持续时间也值得关注。把很慢的外部调用夹在事务中间,会延长锁或资源占用。先准备必要输入,再在尽可能清晰、短小的数据库阶段中完成相关写入。

需要留意的是,事务不能自动回退已经发送的邮件或外部 HTTP 请求。

参考:SQL 文档。

搜索文章

输入关键词,找回一篇记录。