gpt4 book ai didi

sqlite - 自动回滚多个语句的隐式事务?

转载 作者:行者123 更新时间:2023-12-03 13:01:04 25 4
gpt4 key购买 nike

当多个语句一起提交时——用分号分隔()但在同一个字符串中——并且没有包含在显式事务中,仅创建一个隐式事务或者是一个分别为每个语句创建隐式事务?此外,如果后面的语句之一失败并执行自动回滚,是否回滚了所有语句?

这个其他answer几乎满足了我的问题,但官方文档中的措辞让我感到困惑。事实上,这看起来像是重复的,但我特别想知道多个语句的隐式事务。另一个答案没有明确解决这个特殊情况。

举个例子(借用另一个问题),以下内容作为单个字符串提交:

INSERT INTO a (x, y) VALUES (0, 0);
INSERT INTO b (x, y) VALUES (1, 2); -- line 3 error here, b doesn't have column x

documentation

Automatically started transactions are committed when the last query finishes. (emphasis added)

An implicit transaction (a transaction that is started automatically, not a transaction started by BEGIN) is committed automatically when the last active statement finishes. A statement finishes when its prepared statement is reset or finalized. (emphasis added)

关键字last 向我暗示了多个语句的可能性。当然,如果为每个单独的语句启动隐式事务,那么单独执行每个语句将是要执行的“最后”语句,但在单独语句的上下文中,它应该只是说 the 语句强调上下文是一次一个单一的陈述。

或者准备好的语句和未准备的 SQL 字符串之间有区别吗? (但据我所知,即使调用应用程序不保留准备好的语句以供重用,所有语句都会准备好,所以我不确定这是否重要。)

在所有语句都成功的情况下,单次提交或多次提交的结果本质上是一样的,但是文档只提到单条失败的语句会自动回滚,而没有提到其他语句一起提交.

最佳答案

sqlite3_prepare 接口(interface)编译查询字符串中的第一个 SQL 语句。这些函数的 pzTail 参数返回一个指向查询字符串未使用部分开头的指针。

例如,如果您在示例中使用多语句 SQL 字符串调用 sqlite3_prepare,则第一个语句是唯一对生成的准备好的语句有效的语句. pzTail 指针(如果提供)指向第二条语句的开头。在您使用 pzTail 指针再次调用 sqlite3_prepare 之前,第二条语句不会编译为准备好的语句。

所以,不,不会回滚多个语句。 SQLite 引擎创建的每个隐式事务都包含一个准备好的语句。

关于sqlite - 自动回滚多个语句的隐式事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55715413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com