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

问题描述 投票:0回答:1

当多个语句一起提交时 - 由分号(;)分隔但是在同一个字符串中 - 并且不包装在显式事务中,只创建了一个隐式事务,还是分别为每个语句创建的隐式事务?此外,如果后面的一个语句失败并且执行了自动回滚,那么所有语句是否都会回滚?

这个其他的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

最后一个查询完成后,将提交自动启动的事务。 (重点补充)

当最后一个活动语句完成时,将自动提交隐式事务(自动启动的事务,而不是由BEGIN启动的事务)。当其准备好的陈述被重置或最终确定时,语句结束。 (重点补充)

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

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

在所有语句都成功的情况下,单个提交或多个提交的结果基本相同,但是文档仅提到单个失败语句会自动回滚,但不会提及其他一起提交的语句。

sqlite
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.