【发布时间】:2017-05-24 15:49:48
【问题描述】:
我可能误解了 SQLite 中关于 SAVEPOINTS 的一些内容。
我在一个应用程序中使用 C API,我们在其中运行了一堆插入,如果出现故障,我们应该一起放弃所有插入。
我知道我可以 BEGIN TRANSACTION 来处理这样一个简单的场景,但我担心场景会变得更复杂,并且嵌套可能成为一种要求,这就是我选择 SAVEPOINTS 的原因。
无论如何,这是我运行的 SQL 语句的摘录:
SQL> SAVEPOINT SAVEPOINT_20170524_172706;
SQL> INSERT, SELECT STATEMENT (no COMMIT or END TRANSACTION)
SQL> ROLLBACK TO SAVEPOINT SAVEPOINT_20170524_172706;
SQL> RELEASE SAVEPOINT_20170524_172706;
基本上,在我开始从数据库中插入和选择数据之前,我会根据时间戳创建一个新的保存点。 然后一个操作失败了,我需要退出,所以我回滚到我刚刚创建的保存点。 最后我想摆脱我不再需要的保存点,因为我不想用无用的保存点弄乱数据库,因此我运行了 RELEASE 。在这种情况下,我发现自己的数据库中填充了所有由应该回滚的语句插入的数据。
如果我不执行 RELEASE 语句,那么数据库看起来还不错,但我想知道不再引用的废弃 SAVEPOINT 会发生什么。
我做了哪些错误的假设?如果我不释放 SAVEPOINTS 会发生什么情况,当我关闭与数据库文件的“连接”时它们会被“丢弃”吗?
【问题讨论】:
-
为我工作。提供minimal reproducible example。请参阅documentation。
-
@CL 到底什么对你有用?在这里,我并不是暗示它不起作用,而是我做错了什么,不幸的是我无法弄清楚它是什么。事实上,如果我阅读文档(这是我反复做的事情),我看不出为什么我应该在创建保存点之后找到插入的记录,我已经回滚到了。
-
当我执行这四个命令时,第二个命令的效果会正确回滚。
-
顺便说一句,我找到了原因:我有
PRAGMA journal_mode = OFF,不幸的是在SAVEPOINT文档页面中没有提到:(