自动回滚多个语句的隐式事务?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动回滚多个语句的隐式事务?相关的知识,希望对你有一定的参考价值。
当多个语句一起提交时 - 由分号(;
)分隔但是在同一个字符串中 - 并且不包装在显式事务中,只创建了一个隐式事务,还是分别为每个语句创建的隐式事务?此外,如果后面的一个语句失败并且执行了自动回滚,那么所有语句是否都会回滚?
这个其他的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
最后一个查询完成后,将提交自动启动的事务。 (重点补充)
和
当最后一个活动语句完成时,将自动提交隐式事务(自动启动的事务,而不是由BEGIN启动的事务)。当其准备好的陈述被重置或最终确定时,语句结束。 (重点补充)
关键字last告诉我多个语句的可能性。当然,如果为每个单独的语句启动了一个隐式事务,那么每个语句将单独作为要执行的“最后”语句,但是在单个语句的上下文中,它应该只是说该语句强调上下文是一个单一的语句一次。
或者,准备好的语句和未准备好的SQL字符串之间是否存在差异? (但据我所知,即使调用应用程序没有保留准备好的语句以供重用,所有语句也都准备好了,所以我不确定这是否重要。)
在所有语句都成功的情况下,单个提交或多个提交的结果基本相同,但是文档仅提到单个失败语句会自动回滚,但不会提及其他一起提交的语句。
sqlite3_prepare
接口编译查询字符串中的第一个SQL语句。这些函数的pzTail
参数返回指向查询字符串未使用部分开头的指针。
例如,如果在示例中使用多语句SQL字符串调用sqlite3_prepare
,则第一个语句是唯一对生成的预准备语句有效的语句。 pzTail
指针(如果提供)指向第二个语句的开头。在使用sqlite3_prepare
指针再次调用pzTail
之前,第二个语句不会编译为预准备语句。
所以,不,多个语句不会回滚。 SQLite引擎创建的每个隐式事务都包含一个预准备语句。
以上是关于自动回滚多个语句的隐式事务?的主要内容,如果未能解决你的问题,请参考以下文章