【发布时间】:2019-04-17 08:22:32
【问题描述】:
当多个语句一起提交时 -- 用分号分隔 (;) 但在同一个字符串中 -- 并且未包装在显式事务中,仅创建一个隐式事务或为每个语句创建一个隐式事务单独声明?此外,如果后面的语句之一失败并执行自动回滚,是否所有语句都回滚?
另一个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
在最后查询完成时提交自动启动的事务。 (强调)
和
当 last 活动语句完成时,会自动提交隐式事务(自动启动的事务,而不是由 BEGIN 启动的事务)。一个语句在其准备好的语句被重置或最终确定时结束。 (强调)
关键字last对我来说暗示了多个陈述的可能性。当然,如果为每个单独的语句启动一个隐式事务,那么每个语句将是要执行的“最后一个”语句,但在单个语句的上下文中,它应该只是说 the 语句强调上下文是一个单一的语句。
或者说准备好的语句和未准备好的 SQL 字符串有区别吗? (但据我了解,即使调用应用程序没有保留准备好的语句以供重用,所有语句都已准备好,所以我不确定这是否重要。)
在所有语句都成功的情况下,单次commit或者多次commit的结果本质上是一样的,但是文档中只提到了单次失败的语句会自动回滚,而没有提到其他一起提交的语句.
【问题讨论】:
标签: sqlite