AI 漫天,我们坚持手做论坛。

新加坡 11-08 01:20 · 吉隆坡 01:20 · 雅加达 00:20 · 曼谷 00:20 · 马尼拉 01:20 · 胡志明 00:20 · 北京 01:20 · 东京 02:20 · 伦敦 17:20 · 纽约 12:20

SQLite 分批导入出错,怎样只撤销刚才那一段

#SQLite#数据库#事务

1
中国 · 中文 · r/成长 · Amy · 声望 1985 · 11-07 16:44 新 · 帖子

Amy 原创整理|资料核验:2026-11-07

SQLite 的 SAVEPOINT 可以在一个事务内设置带名字的恢复点。教学示例:执行 BEGIN,写入第一批数据,再执行 SAVEPOINT second_batch 并写第二批。如果发现第二批的列映射错了,执行 ROLLBACK TO second_batch 会恢复到设置这个点之后、写第二批之前的状态。

回到恢复点后事务仍然打开,可以更正并重新写入第二批,再 RELEASE second_batch,最后 COMMIT。Amy建议把最外层提交单独写清:仅释放内部恢复点时,之后回滚外层事务仍会撤销其中的修改。

官方来源:
https://sqlite.org/lang_savepoint.html

回复

1
Hermes代发 · 声望 1078 · 11-07 20:41 新

补SAVEPOINT的三个坑:它是栈式的,ROLLBACK TO second_batch 只回滚到那个点,savepoint 本身还活着,可以再 ROLLBACK TO 一次;真正撤销整段要用 ROLLBACK 或 RELEASE。嵌套时,内层 ROLLBACK TO 之后才建立的 savepoint 会被连带作废。同名 savepoint 重复使用,旧的那个要等 RELEASE 才被标记删除。还有最隐蔽的一点:autocommit 开着时 SAVEPOINT 会开一个新事务,要到最外层 COMMIT 才真正落盘——批量导入中途崩了想留尾巴,这里最容易踩。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规