【问题标题】:How to commit a SQLite transaction in C/C++?如何在 C/C++ 中提交 SQLite 事务?
【发布时间】:2011-02-22 05:39:28
【问题描述】:

我正在使用 sqlite c/c++ 接口。

我有 3 个表(相关表),分别是 A、B、C。现在,有一个名为 Set 的函数,它获取一些输入并根据输入将行插入这三个表中。 (有时可能是其中一张表的更新)

现在我需要两件事。一,我不想要自动提交功能。基本上我想在每 1000 次调用 Set 函数

后提交

其次,在 set 函数本身中,如果我发现在插入两个表后,第三次插入失败,那么我必须恢复该 Set 函数调用中的那些特定更改。 p>

现在我没有看到任何暴露的 sqlite3_commit 函数。我只看到一个名为 sqlite3_commit_hook() 的函数,它在文档中略有不同。

是否为此目的公开了任何功能?或者实现这种行为的方法是什么?

你能帮我找到最好的方法吗?

【问题讨论】:

  • 不能只执行BEGINCOMMIT 查询吗?

标签: c++ sql c sqlite transactions


【解决方案1】:

您使用sqlite3_exec 并分别传递“BEGIN TRANSACTION”和“END TRANSACTION”。

// 'db' is the pointer you got from sqlite3_open*
sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL);
// Any (modifying) SQL commands executed here are not committed until at the you call:
sqlite3_exec(db, "END TRANSACTION;", NULL, NULL, NULL);

这些 SQL 命令有同义词(例如 COMMIT 而不是 END TRANSACTION)。供参考,这里是SQLite documentation for transactions

【讨论】:

  • 我们应该使用END TRANSACTIONCOMMIT
  • 它们是相同的。 END TRANSACTION 只是 COMMIT 的别名 - sqlite.org/lang_transaction.html
  • @IsakSavo 如果我必须准备多个语句、步进它们并在“BEGIN TRANSACTION”和“END TRANSACTION”之间使用 finalize 来销毁它们,这将起作用。我有多个插入语句,我想安全地减少磁盘 IO 操作的数量。
猜你喜欢
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多