【问题标题】:SAVEPOINT mechanism in SQLiteSQLite 中的 SAVEPOINT 机制
【发布时间】:2016-12-02 00:46:42
【问题描述】:

我正在尝试了解 SQLite 中的保存点和事务。 我在表/数据库上有以下命令,我正在使用保存点。

SAVEPOINT aaa;
RELEASE aaa;
BEGIN;

现在,如果我一次执行上述所有语句,它会抛出一个错误,指出 A transaction cannot be started inside another transaction。如果我一次运行它们,它工作正常。 如果我运行前两个 Savepoint 和 release 命令并尝试通过执行 Begin 来启动另一个事务。它再次抛出与以前相同的错误。

链接here

如果在 SQLite 处于自动提交模式(即在事务之外)时发出 SAVEPOINT 命令,则将启动标准自动提交 BEGIN DEFERRED TRANSACTION。但是,与大多数命令不同,自动提交事务不会在 SAVEPOINT 命令返回后自动提交,从而使系统处于打开的事务中。自动事务将保持活动状态,直到原始保存点被释放,或者外部事务被显式提交或回滚。 `

那么,在 Release Savepoint 命令之后是否绝对需要 Commit 或 Rollback 命令? release 命令不提交并允许我们使用BEGIN 启动新事务吗?

【问题讨论】:

  • 你在使用 Python 吗?
  • 不,我们使用的是 C#
  • 怎么样?显示代码。
  • 我们打算使用 C#,但我在普通 SQLite 编辑器中尝试上述命令只是为了了解保存点以决定保存点和事务或两者的混合。
  • 这听起来像是该软件中的一个错误。尝试在sqlite3 中重现它。

标签: sqlite transactions savepoints


【解决方案1】:

SAVEPOINT aaa; RELEASE aaa; BEGIN;

被sqlite解释为

BEGIN DEFERRED TRANSACTION; SAVEPOINT aaa; // Create a transaction, and mark current db state as savepoint "aaa" [1] RELEASE aaa; // Remove all db changes made since savepoint "aaa", but keep on executing the transaction BEGIN; // Create another transaction, while there is already a transaction. This will FAIL because there cannot be 2 transactions executed simultaneously

以下就可以了:

BEGIN; SAVEPOINT "aaa"; RELEASE "aaa"; COMMIT; BEGIN;

[1]https://sqlite.org/lang_savepoint.html

【讨论】:

  • 根据您发布的文档链接,释放最外层保存点应提交:“如果 RELEASE 命令释放最外层保存点,使事务堆栈变为空,则 RELEASE 与 COMMIT 相同。” .它还取决于当前的自动提交值 - 根据safaribooksonline.com/library/view/using-sqlite/9781449394592/…“......但是,与大多数命令不同,自动提交事务不会在 SAVEPOINT 命令返回后自动提交,从而使系统处于打开的事务中......”跨度>
  • 链接文档显示“当 SAVEPOINT 是最外层的保存点并且它不在 BEGIN...COMMIT 内时,行为与 BEGIN DEFERRED TRANSACTION 相同。”它说 same as 而不是“also”。你的解释是不正确的。正如 awattar 评论的那样,在没有 BEGIN TRANSACTION 的情况下启动的最外层 SAVEPOINT 将在匹配的 RELEASE 上提交。问题中描述的行为可能是由于 3rd-party 工具的错误/自动事务处理。我在多个 sqlite 工具中观察到了许多类似的问题。
  • 听听@awattar 和 CPerkins 的说法。这“被sqlite解释为”您的答案的一部分是错误的。它为一个已经令人费解的话题增加了不确定性。请重新制定您的答案以避免这种说法。 “会很好”的部分很好:)
猜你喜欢
  • 2014-05-11
  • 2017-10-29
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2013-07-19
  • 2020-04-13
  • 2022-11-16
相关资源
最近更新 更多