【问题标题】:SQLite SAVEPOINTS: how does ROLLBACK works in conjunction with RELEASE?SQLite SAVEPOINTS:ROLLBACK 如何与 RELEASE 结合使用?
【发布时间】: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文档页面中没有提到:(

标签: sqlite release rollback


【解决方案1】:

我有PRAGMA journal_mode = OFF

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2019-08-15
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2012-04-01
    相关资源
    最近更新 更多